任务栈和启动模式

1. 任务栈

任务栈包含 Task 和 Back Stack 两方面含义。
参照: https://developer.android.com/guide/components/activities/tasks-and-back-stack.html

Task

当我们打开一个App应用( 如: 今日头条),从A页面启动B页面,再从B页面启动C页面。此时我们打开的这个APP应用就可以称之为一个 Task ,一个 Task 里面包含了很多个Activity(Web则称之为子页面)。我们可以通过 adb shell dumpsys activity 命令来查看当前正在运行的 Task 信息。

Back Stack

当我们按下 返回 按钮时,会将当前任务栈中栈顶元素依次 POP 出去 ,使得前一个页面显示到前台。

2. 启动模式

当你在 manifest 中描述一个 activity时,你能够使用 activity 元素的 launchMode 属性和一个 Task 进行关联。
这里有四种不同的方式的去设定 launchMode

standard (the default mode)

当它被启动的时候,系统会为它创建一个新的实例,将其追加到 Task 路由里面。可以被创建多次。
例如:当A页面调用A页面,新建的A页面会被追加到 Task 路由里面。

singleTop

只有处于栈顶的Activity调用自身的时候,不会再次被创建,而是执行 onNewIntent() 方法。
例如:B页面被设为singleTop模式,当A页面启动B页面时,B被创建并被追加到 Task 中。当B页面启动自身的时候,B页面并不会被再次创建出
来,而是执行 onNewIntent() 。 当B页面不处于栈顶的时候,才被会再次创建出来

singleTask

当Activity设为此模式时,只有创建一次实例,并被追加到 Task 中,当再次被调用的时候,不会被创建,执行onNewIntent() 方法。
例如:B页面被设为singleTask模式,当A页面启动B页面时,B被创建并追加到 Task 中。当B页面启动C页面,C页面再启动D页面。当D页面启动B
页面时,C和D页面被销毁,B处于栈顶被显示出来。

singleInstance

当Activity设为此模式时,只有创建一次实例,并被追加到另一个 Task 中,当再次被调用的时候,不会被创建,执行onNewIntent() 方法。
例如:B页面被设为singleInstance模式,当A页面启动B页面时,B被创建,并追加到 另一个 Task 中。当B启动A页面时,A页面被再次创建出来。

当在A页面单击 返回 按钮时,处于 Task1 中栈顶A页面被销毁,再次单击 返回 按钮,处于 Task1 中栈底A页面被销毁,此时 Task1 中没有任何的 Activity,Task1 也随之被销毁。如果此时再单击 返回 按钮时,Task2 中B页面被销毁。

by 李店店.