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

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

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时携带数据返回。

    // MainActivityIntent intent = new Intent(MainActivity.this, SecondActivity.class);intent.putExtra("requestType", "add");startActivityForResult(intent, 1);// SecondActivitypublic 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恢复数据@Overrideprotected 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/

    你可能感兴趣的文章
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>