android taskAffinity研究

1. taskAffinity和singleTask,singleInstance

taskAffinity 是用来指示 Activity 属于哪一个 Task 的,默认情况下 Activity 的 taskAffinity 是包名。在代码设置方式为:

1
2
3
4
5
<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。

  1. 如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity 以上的 Activity 并调用 onNewIntent 。如果没有实例化,那么该Activity实例化并入栈。
  2. 如果不存在,那么就重新创建 Task,并入栈。

如果启动的 thisActivity 是 singleTask 模式的话,在它上面再次启动 otherActivity 的话,则 otherActivity 所在的 Task 是 thisActivity 所在的 Task

以上图例表示:存在三个 Activity,FirstActivity ,SecondActivity 和 ThirdActivity。其中 SecondActivity 设置了 singleTask 以及和其他两个 Activity 不同的 taskAffinity。他们的跳转流向为:

FirstActivity ——-> SecondActivity ——-> ThirdActivity

singleInstance

  1. 当一个应用程序加载一个 singleInstance 模式的 Activity 时,如果该 Activity 没有被实例化,那么就重新创建一个 Task,并入栈,如果已经被实例化,那么就调用该 Activity 的 onNewIntent ;
  2. 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


关于作者:

1. 博客 http://crazyandcoder.github.io/

2. github https://github.com/crazyandcoder

3. 掘金 https://juejin.im/user/56b96af96240b8005865df59/share