博客
关于我
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/

    你可能感兴趣的文章
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    MySQL DBA 进阶知识详解
    查看>>
    Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
    查看>>
    Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
    查看>>
    mysql deadlock found when trying to get lock暴力解决
    查看>>
    MuseTalk如何生成高质量视频(使用技巧)
    查看>>
    mutiplemap 总结
    查看>>
    MySQL DELETE 表别名问题
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>
    mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
    查看>>
    Mysql group by
    查看>>