第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)状态。

  • 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的

你可能感兴趣的:(Android)