博客
关于我
Android学习笔记(四)Android 中Activity页面的跳转及传值
阅读量:807 次
发布时间:2019-03-25

本文共 5467 字,大约阅读时间需要 18 分钟。

Activity的生命周期及数据传递

作为Android开发者,理解Activity的生命周期是掌握Android应用开发的基础。Activity是Android中表示用户界面(UI)的基本组件,一个Application可能包含多个Activity。Activity的生命周期决定了其显示状态和状态转换。了解Activity的生命周期有助于开发者更好地管理应用程序的UI组件和状态。

Activity的生命周期

Activity有一系列方法用以描述其生命周期,这些方法的顺序和执行顺序决定了Activity的状态变化。常见的Activity生命周期方法包括:onCreate、onStart、onResume、onPause、onStop、onDestroy等。以下是这些方法的基本解释:

  • onCreate:当Activity第一次被创建时调用。这是Activity准备好显示给用户的时刻。在此方法中,开发者可以初始化Activity的组件,例如布局(View)、数据(数据源)等。

  • onStart:当Activity被显示给用户时调用。这是显示Activity内容之前调用。通常用于在UI元素已经被绘制之前进行一些预置工作,例如设置UI状态或准备数据。

  • onResume:当Activity准备好让用户与其互动时调用。这一阶段可以进行更多复杂的操作,比如动画处理、第三方库初始化等。通常用于在Activity首次显示之前完成所有准备工作。

  • onPause:当Activity暂停显示时调用。例如,当用户切换到其他任务、活动被保存或恢复时,onPause会被调用。这是用户可以进行保存操作(如保存当前状态)的好时机。

  • onStop:当Activity完全移出用户视野时调用。比如,在另一个任务切换到前面时,后台任务可能在onStop中被终止。

  • onDestroy:当Activity不再需要时被调用。这是彻底销毁Activity的最后阶段,开发者可以在此方法中释放资源,例如取消订阅等。

  • Activity的生命周期图通常从onCreate开始,到onDestroy结束,画出四个状态:运行、暂停、停止和销毁。开发者需要正确管理这些状态,确保应用程序的响应和性能。

    Activity与Task的关系

    Android中的Task是一个存储Activity的栈,与操作系统交互,按先进后出的规则管理Activity。Task遵循压栈(push)和出栈(pop)的原则。

    • 压栈:每当一个Activity被启动时,新Activity会被压入Task栈的栈顶位置。比如,用户点击菜单选项启动新界面,新界面会成为当前栈顶的Activity。

    • 出栈:当用户切换到其他任务时,当前的Activity会被弹出栈顶位置,释放内存资源。

    默认情况下,如果在跳转到下一个Activity时,未调用finish方法,当前Activity不会退出而是保存在栈顶位置,等待用户返回或切换到该界面时恢复。

    使用Intent传递数据

    在Android中,Intent是跨进程通信的标准方式,常用于启动Activity并传递数据。Intent对象可以携带多种数据类型,包括文本、图片、实体等,以及自定义数据结构。

    向下一个Activity传递参数

    为了实现数据传递,可以通过Intent携带数据。以下是一个示例:

    • MainActivity:通过EditText获取用户输入,点击提交按钮启动第二个Activity,并将数据通过Intent传递。
    Intent intent = new Intent(MainActivity.this, Main2Activity.class);
    intent.putExtra("name", name);
    intent.putExtra("age", age);
    intent.putExtra("sex", sex);
    intent.putExtra("phone", phone);
    intent.putExtra("hobbies", str.toString());
    startActivity(intent);
    • Main2Activity:接收数据并显示。
    public class Main2Activity extends AppCompatActivity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    textView = findViewById(R.id.textView);
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
    String name = extras.getString("name");
    String age = extras.getString("age");
    String sex = extras.getString("sex");
    String phone = extras.getString("phone");
    String hobbies = extras.getString("hobbies");
    // 展示输入的数据
    textView.setText("你的姓名:" + name + "\n年龄:" + age + "\n性别:" + sex
    + "\n电话:" + phone + "\n爱好:" + hobbies);
    }
    }
    }

    返回参数到上一个Activity

    当需要从下一个Activity返回数据到上一个Activity时,可以使用startActivityForResultsetResult方法。setResult允许调用者在结束当前Activity时携带数据返回。

    // MainActivity
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtra("requestType", "add");
    startActivityForResult(intent, 1);
    // SecondActivity
    public class SecondActivity extends AppCompatActivity {
    private ListView listview;
    private ArrayAdapter
    adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    String[] data = {"北京", "上海", "广州", "深圳"};
    listview = findViewById(R.id.listview);
    adapter = new ArrayAdapter<>(this, R.layout.item_select, data);
    listview.setAdapter(adapter);
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView
    adapterView, View view, int position, long l) {
    String value = data[position];
    setResult(RESULT_OK, new Intent().putExtra("value", value));
    finish();
    }
    });
    }
    }

    // MainActivity恢复数据 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK && data != null) { String value = data.getStringExtra("value"); textView.setText("你选择了:" + value); } }

    这种方法允许父Activity根据请求代码(`requestCode`)辨别哪些数据是来自于哪个任务。
    ### 优化代码:使用 intent.putExtra 将更多参数传递
    有一些情况下,`putExtra`会将字符串、整数等类型的数据进行序列化处理,可以多次调用`putExtra`传送多个参数。或者,使用`Bundle`对象包装复杂数据。例如,可以将用户的选择结果返回至上一个Activity。
    ## 技术亮点与应用场景
    1. **Bundle机制**:`Bundle`是一个超级类,用于储存多种数据类型,类似于Java中的`HashMap`,但支持类似于`serialization`。这使得数据保存和抽取更加安全和简便。
    2. **队列任务管理**:使用`Task`栈管理组件,确保UI操作的正确顺序。压栈和出栈操作暗示了任务管理机制的重要性。
    3. **数据传递方向**:需要注意数据传递的方向和使用模式。比如,在`Activity`之间传递数据可以选择使用`startActivity`或`fragmentTransaction`等方法,这会影响数据传递的生命周期。
    ### Activity生命周期的理解
    理解Activity的生命周期有助于正确管理UI组件和状态。一个典型的生命周期流程可能如下:
    - **onCreate**:初始化Activity,准备数据和组件。
    - **onStart**:将Activity显示给用户。
    - **onResume**:用户开始与活动交互。
    - **onPause**:活动进入冷置状态,用户切换任务或锁屏。
    - **onStop**:活动完全退出,释放资源。
    - **onDestroy**:彻底销毁活动资源。
    开发者应谨慎地管理生命周期方法的执行,如无需recyclerView时,避免在onDestroy中进行耗时任务,以免影响性能。
    ### 实际开发中的问题
    在实际开发中,常见问题包括:
    1. **Activity销毁问题**:短时间频繁切换任务,可能导致ANR(应用程序不应响应),需要优化生命周期方法。
    2. **数据传递问题**:如果数据传递复杂,可能导致Bundle中数据丢失或不一致,需要正确序列化和反序列化。
    3. **权限和状态管理**:在启动子Activity时,需确保正确传递权限,并释放资源,避免内存泄漏。
    4. **崩溃报告**:使用崩溃报告工具收集数据,定位错误例子,提升应用稳定性。
    ## 总结
    现在,Activity的生命周期、Task栈管理和Intent数据传递的基础知识已经相对清晰。在实际开发中需要注意以下几点:
    1. **保持生命周期方法的简洁性和高效性**,避免在`onDestroy`中执行长时间任务或阻耗操作。
    2. **规范数据传递**,确保通过`Bundle`或`parcelable`对象传输大数据量的数据,避免 nginxg数据拆分。
    3. **正确使用`startActivityForResult`和`setResult`方法**,管理任务请求和数据返回,提升用户体验。
    4. **及时回收资源**,避免内存泄漏,定期调试打印日志,检查生命周期中的资源释放是否正确。
    通过理解和应用这些知识,开发者可以更好地管理Android应用程序的多页展示和数据流转,构建出稳定、高效的应用程序。

    转载地址:http://ewayk.baihongyu.com/

    你可能感兴趣的文章
    Node读取并输出txt文件内容
    查看>>
    node防xss攻击插件
    查看>>
    noi 1996 登山
    查看>>
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    noi.ac #36 模拟
    查看>>
    NOI2010 海拔(平面图最大流)
    查看>>
    NOIp2005 过河
    查看>>
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    non linear processor
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>