《Android开发艺术探索》笔记——第一章 Activity的生命周期和启动模式
如果要查看 Activity Task栈的情况,可以在命令行用 adb 命令查看
adb shell dumpsys activity activities1. Activity的生命周期 1)正常情况下
- 第一次启动
onCreate --> onStart --> onResume
- 用户打开新的Activity或者切换到桌面
onPause --> onStop如果新Activity是透明主题,那么不会调onStop
- 用户再次回到原Activity
onRestart --> onStart --> onResume
- 用户back键回退
onPause --> onStop --> onDestroy
- A、B两个Activity 跳转变化
进入A
A onCreate --> A onStart --> A onResume? A跳转B
A onPause --> B onCreate --> B onStart --> B onResume --> A onStop? B返回A
B onPause --> A onRestart --> A onStart --> A onREsume --> B onStop --> B onDestroy? A back
A onPause --> A onStop --> A onDestroy2)异常情况下 Activity在异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,和onPause没有既定的时序关系。恢复时调用onRestoreINstanceState,调用时机在onStart之后。
onPause–onSaveInstanceState–onStop–onDestory–onCreate–onStart–onResume3)注意点
- 旧Activity的onPause先调用,新Activity才启动
- onStart和onStop
分别代表了Activity已经处于可见状态和不可见状态,此时的Activity未处在前台,不可以与用户交互,可多次被调用,期间Activity处于可见(visable lifetime)状态。
- 【第1章 Activity的生命周期和启动模式】onResume和onPause
分别代表了Activity已经进入前台获得焦点和退出前台失去焦点,此时的Activity是可以和用户交互的,可多次被调用,期间的Activity处于前台(foreground lifetime)状态。
- 弹出一个Dialog时,onPause会调用吗?什么情况下会,什么情况下不会?
如果弹出的是本Activity的Dialog,并不会有任何生命周期方法调用。Dialog是一个View,它本身就依附在Acitivty上,可以理解为是属于本Activity的,所以它的焦点也自然是本Activity的焦点,自然不会有什么生命周期方法调用了。如果其他Activity的Dialog弹出了,onPause才会调用
Dialog 上面再启动一个Activity,原Activity onPause–>新Activity onCreate --> onStart --> onResume --> 原Activity onSaveInstanceState --> onStop
- Activity调用了onDestory方法,就会在Activity的任务栈消失吗?
什么时候onDestory会被调用呢?
可以分为两大类:1.点击了back键 2.Activity被意外销毁
点击back键相当于调用了finish()方法,通常来说finish
方法会至少有两个目的,一是将Activity从返回栈中退出,二是调用onDestory方法(未必是及时调用)
而直接调用onDestory,是不会将Activity在任务栈中清除的。
2)singleTop 栈顶复用模式 如果新Activity已经位于任务栈的栈顶,那么此Activity不会被创建,它的onNewIntent方法会被回调,onCreate、onStart方法不会被调用
3)singleTask 栈内复用模式 只要Activity在栈中存在,那么多次启动都不会重新创建实例,调用时调到栈顶,singleTask具有clearTop的效果,其上Activity被全部出栈,回调onNewIntent
4)singleInstance 单实例模式 加强的singleTask,具有此种模式的Activity只能单独地位于一个任务栈中
5)注意
- 启动后台任务栈的Activity时,整个后台任务栈都会被切换到前台
- TaskAffinity 参数标识了一个Activity所需要的任务栈的名字;它和singleTask 启动模式配对使用时,它是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在,名字和TaskAffinity相同的任务栈中
- 启动模式设置代码优先级高于Manifest中配置,但是代码无法指定singleInstance模式,manifest无法直接设定 FLAG_ACTIVITY_CLEAR_TOP
launchMode | 使用场景 |
---|---|
singleTop | 适合启动同类型的 Activity,例如接收通知启动的内容显示页面 |
singleTask | 适合作为程序入口 |
singleInstance | 适合需要与程序分离开的页面,例如闹铃的响铃界面 |
4)FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现在历史Activity的列表中
4. IntentFilter的匹配规则 IntentFilter中所设置的过滤信息有action、category、data
1)action 的匹配规则 匹配要求字符串值完全一样,Intent中的action能够和过滤规则中的任何一个action相同即可
2)category Intent 中所有的 category都必须和过滤规则中的其中一个 category相同
3)data 由 mimeType 和 URI 组成,匹配要求Intent中的data能够完全匹配过滤规则中的某一个data
4)使用 PackageManager 的 resolveActivity 方法或者 Intent 的 resloveActivity 方法判断通过隐式要启动的Activity是否为null 5)不含有 DEFAULT 这个 category 的Activity 是无法接收隐式 Intent的