第1章 Activity的生命周期和启动模式

《Android开发艺术探索》笔记——第一章 Activity的生命周期和启动模式
如果要查看 Activity Task栈的情况,可以在命令行用 adb 命令查看

adb shell dumpsys activity activities
1. 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 onDestroy
2)异常情况下 Activity在异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,和onPause没有既定的时序关系。恢复时调用onRestoreINstanceState,调用时机在onStart之后。
onPause–onSaveInstanceState–onStop–onDestory–onCreate–onStart–onResume
3)注意点
  • 旧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. Activity 的启动模式 1)standard 标准模式 系统的默认模式,每次启动都创建一个新的实例,运行在启动它的那个Activity所在的栈中,用ApplicationContext去启动会报错,因为Context没有任务栈,这时需要为待启动的Activity指定 FLAG_ACTIVITY_NEW_TASK,相当于singleTask
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 适合需要与程序分离开的页面,例如闹铃的响铃界面
3. Activity中常用的标志位 1)FLAG_ACTIVITY_NEW_TASK 2)FLAG_ACTIVITY_SINGLE_TOP 3)FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_NEW_TASK 配合使用,被启动的Activity如果已经存在,系统会调用它的onNewIntent;如何被启动的Activity采用standard模式,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
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的

    推荐阅读