零、资料
- 《第一行代码》
- 《Android 开发艺术探索》
一、Stack (任务栈)
- 栈是一种先进先出的数据结构。
- 每当启动一个新活动时,它就会入栈并处于栈顶。
- 每当销毁一个活动时,处于栈顶的活动就会出栈,前一个入栈的活动重新处于栈顶。
- 任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity 位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。
二、TaskAffinity (任务相关性)
- 此参数标识了一个 Activity 所需的任务栈的名字。
- 默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。
- 我们可以为每个 Activity 都单独指定 TaskAffinity 属性。
- 主要和 singleTask 启动模式或 allowTaskReparenting(允许任务重排) 属性配对使用。
三、LaunchMode (启动模式)
-
standard:
- 标准模式,系统默认模式。每次启动一个Activity都会重新创建一个新的实例。
- 一个任务栈中可以有多个实例每个实例也可以属于不同的任务栈。
- 在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个Activity所在的栈中。
- 当用 ApplicationContext 去启动 standard 模式的 Activity 会报错,因为 ApplicationContext 无任务栈。
-
singleTop:
- 栈顶复用模式。
- 在这种模式下,如果新Activity 已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent()会被回调,通过此方法的参数我们可以取出当前请求的信息。
- 此时被服用的 Activity 的onCreate、onStart 不会被系统调用,因为它并没有发生改变。
- 如果新 Activity 的实例已存在但不是位于栈顶,那么新Activity 仍然会重新重建。
-
singleTask:
- 栈内复用模式。单实例,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,系统会回调onNewIntent()。
- 当该模式 A 请求启动后,会先寻找是否存在 A 想要的任务栈。如不存在则创建任务栈并创建 A 压入栈中;如存在所需任务栈,则查看 A 是否在栈中如不存在则创建 A 压入栈中。
- singleTask 默认具有 clearTop 的效果,会清空栈顶其它 Activity。
-
singleInstance:
- 单实例模式。
- 加强版的 singleTask。
- 此种模式的 Activity 只能单独地位于一个任务栈中。
2019-10-15