1. taskAffinity和singleTask,singleInstance
taskAffinity 是用来指示 Activity 属于哪一个 Task 的,默认情况下 Activity 的 taskAffinity 是包名。在代码设置方式为:
<activity
android:name=".SecondActivity"
android:launchMode="singleTask"
android:taskAffinity="com.test.SecondActivity">
</activity>
一般情况下 taskAffinity 的使用配合 Activity 的启动模式 LaunchMode 来一起使用。
singleTask
默认情况下,在一个 app 中的所有 Activity 都有一样的 taskAffinity。当一个应用程序加载一个 singleTask 模式的 Activity 时,首先该 Activity 会检查是否存在与它的 taskAffinity 相同的 Task。
- 如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity 以上的 Activity 并调用 onNewIntent 。如果没有实例化,那么该Activity实例化并入栈。
- 如果不存在,那么就重新创建 Task,并入栈。
如果启动的 thisActivity 是 singleTask 模式的话,在它上面再次启动 otherActivity 的话,则 otherActivity 所在的 Task 是 thisActivity 所在的 Task
以上图例表示:存在三个 Activity,FirstActivity ,SecondActivity 和 ThirdActivity。其中 SecondActivity 设置了 singleTask 以及和其他两个 Activity 不同的 taskAffinity。他们的跳转流向为:
FirstActivity ——-> SecondActivity ——-> ThirdActivity
singleInstance
- 当一个应用程序加载一个 singleInstance 模式的 Activity 时,如果该 Activity 没有被实例化,那么就重新创建一个 Task,并入栈,如果已经被实例化,那么就调用该 Activity 的 onNewIntent ;
- singleInstance的 thisActivity 所在的 Task 不允许存在其他Activity,任何从该 thisActivity 加载的 otherActiivty 都会被放入其它的 Task 中,如果存在与 otherActiivty 相同 affinity 的 Task,则在该 Task 内创建 otherActiivty。如果不存在,则重新生成新的 Task 并入栈。
如果启动的 thisActivity 是 singleInstance 模式的话,在它上面再次启动 otherActivity 的话,则 otherActivity 所在的 Task 不在是thisActivity 所在的 Task ,singleInstance的Activity所在的Task不允许存在其他Activity
以上图例表示:存在三个 Activity,FirstActivity ,SecondActivity 和 ThirdActivity。其中 SecondActivity 设置了 singleInstance 以及和其他两个 Activity 不同的 taskAffinity。他们的跳转流向为:
FirstActivity ——-> SecondActivity ——-> ThirdActivity