目录
- 一、简介
- 二、生命周期
- 三、启动模式
- 3.1 Standard
- 3.2 Single Task
- 3.3 SingleTop
- 3.4 Single Instance
- 3.5 启动模式的配置
- 四、Activity 的跳转和数据传递
- 4.1 Activity 的跳转
- 4.1.1 直接跳转
- 4.1.2 回调
- 4.2 Activity 的数据传递
- 4.2.1 传递普通数据
- 4.2.2 传递一组数据
- 4.2.3 传递对象
- 五、启动过程
一、简介
ctivity是安卓四大组件之一,用于展示用户界面和处理用户交互。每个Activity都会占据屏幕上的一部分空间,并且可以包含各种UI元素,如按钮、文本框、图片等。Activity通常会响应用户的操作,如点击按钮、输入文本等。
二、生命周期
方法 | 调用时刻 | 使用场景 |
---|---|---|
onCreate() | Activity开始创建时(生命周期的第1个方法) | 初始化工作(如setContentView加载界面布局资源) |
onStart() | Activity正在被启动时(此时,Activity还不可见(在后台)&还无法与用户交互) | |
onResume() | 时刻1:Activity第1次启动完毕。时刻2:当前Activity被挡住1部分后(失去焦点,处于onPause状态),重新回到当前Activity时(Ul最顶层)(如:弹窗消失) | 数据恢复 & 展示 |
onPause() | Activity 停止时 &仍可见时(如 弹窗出现) | 数据存储、停止动画、注销广播等操作(注:不能做耗时操作) |
onStop() | Activity不在U最顶层 & 完全被挡住不可见时 | 回收工作 & 资源释放 |
onRestart() | 处于onStop()状态时(不可见)重新回到该Activity(Ul最顶层) | 数据恢复 |
onDestory() | Activity 即将被销毁时 | 回收工作 & 资源释放 |
①进入页面→退出页面:
进入的时候: oncreate->onstart→onresume
退出的时候: onpause->onstop->ondestroy
②进入页面→按 HOME 使页面后台运行→返回页面
进入页面: oncreate→onstart→onresume
进入 HOME,页面后台运行: onpause→onstop
返回页面: onrestart->onstart->onresume
退出的时候: onpause->onstop→ondestroy
③进入页面->finish 返回上层->再次进入->虚拟返回键退出
进入页面: oncreate→onstart→onresume
finish 返回上层: onpause->onstop→ondestroy
再次进入: oncreate→onstart→onresume
虚拟按键退出: onpause->onstop→ondestroy
③中可得, finish 方法返回所走的生命周期与虚拟返回键的生命周期一致。
三、启动模式
3.1 Standard
3.2 Single Task
3.3 SingleTop
3.4 Single Instance
3.5 启动模式的配置
四、Activity 的跳转和数据传递
4.1 Activity 的跳转
主要有以下两种方式
startActivity(Intent intent);
startActivityForResult(Intent intent,int requestCode);
这两个函数,传递数据的话利用 Intent 进行传递,复杂数据需要配合 Bundle 使用。可以
利用这两个函数在 Activity 之间的跳转以及传递数据。
4.1.1 直接跳转
这里有两个 Activity: FirstActivity 与 SecondActivity,从 FirstActivity 中跳转到SecondActivity 中只需要一个 startActivity()即可:
startActivity(new Intent(this,SecondActivity.class));
一般需要在 SecondActivity 中加上 finish()函数,表示这个 Activity 结束,比如这里直接在 SecondActivity 的按钮事件里面加上了 finish():
4.1.2 回调
很多情况下需要在 FirstActivity 跳转到 SecondActivity 后,在 SecondActivity 进行相应的操作,如更新数据之类,然后返回 FirstActivity,通知 FirstActivity 执行某些操作,这时候就需要使用 startActivityForResult()。
startActivityForResult 有两个参数,一个是 Intent,表示将要跳转的 Activity,一个是requestCode,表示请求码,用于调用 Activity 的 onActivityResult()函数。
如 FirstActivity 中:
startActivityForResult(new Intent(this,SecondActivity.class),11);
这里 11 就是请求码,然后在 SecondActivity 中,使用 setResult()函数:
setResult(22,new Intent().putExtra("str","from second activity"));
setResult()接受两个参数,第一个参数表示 resultCode,从这个 SecondActivity 返回的结果码,另一个 Intent,表示要返回给 FirstActivity 的数据。
最后在 FirstActivity 中重载 onActivityResult():
4.2 Activity 的数据传递
4.2.1 传递普通数据
传递普通类型的数据直接使用 Intent 的 putExtra()即可, putExtra 接受两个参数,第一个是一个 String,表示键,第二个是值,类型可以是 byte、 char、 short、 long 等基本类型与这些基本类型组成的数组,当然 String 也可以。
比如在 FirstActivity 中,传递数据给 SecondActivity:
然后在 SecondActivity 中使用 getIntent()获取 Intent 后,再从里面获取数据:
如果想从 SecondActivity 中返回数据给 FirstActivity,也就是从被调用的 Activity 中返回数据,可以使用前面介绍过的 setResult()方法。
其中第二个参数是一个用于存储数据的 Intent,把数据 put 进去即可。
最后记得在 onActivityResult 做相应的判断处理:
4.2.2 传递一组数据
当数据的种类变多时,比如混合了 int、 String、 byte、 char 等,可以对逐个类型使用putExtra(),但更好的方法是使用 Bundle。
Bundle 的使用与 Intent 类似,也是对于不同的类型采用键值对的添加方法,直接
putXXX:
数据添加完毕之后,在 intent 中使用 putExtras(bundle):
然后就可以在 SecondActivity 中接收数据了。
首先需要使用 getIntent().getExtras()获取 Bundle,再获取里面的数据。
注意一下获取到的 Bundle 有可能为 null,取数据前需要判断一下。
4.2.3 传递对象
如果想要传递的数据是一个对象怎么办?难道对每一个属性都使用 get 再放进去吗?
并不是, Bundle 提供了一个处理序列化对象的方法:
只要对象实现了 Serializable,就可以被 Bundle 处理,比如这里有一个测试类 Student:
然后在 FirstActivity 中直接 new 一个,并使用 Bundle 的 putSerializable 即可。
接着再 SecondActivity 中通过 Intent 取出 Bundle 后,使用其中的 getSerializable()取
出对象,最后使用强制类型转换
五、启动过程
当请求启动Activity时:
- 1.Launcher进程通过Binder驱动向ActivityManagerService类发起startActivity请求;
- 2.ActivityManagerService类接收到请求后,向ActivityStack类发送启动Activity的请求;
- 3.ActivityStack类记录需启动的Activity的信息 & 调整Activity栈 将其置于栈顶、通过 Binder 驱动 将 Activity 的启动信息传递到ApplicationThread线程中(即Binder线程)
- 4.ApplicationThread线程通过Handler将Activity的启动信息发送到主线程ActivityThread
- 5.主线程ActivityThread类接收到该信息 & 请求后,通过ClassLoader机制加载相应的Activity类,最终调用Activity的onCreate(),最后启动完毕