在默认情况下,同一应用中的所有 Activity 会具有相同的亲和性,所有 Activity 默认会以当前应用的 applicationId 作为自己的 taskAffinity 属性值。我们可以手动为应用内的部分 Activity 指定特定的 taskAffinity,从而将这部分 Activity 进行分组
<activity
android:name=".StandardActivity"
android:launchMode=“standard”
android:taskAffinity=“task.test1” />
<activity
android:name=".SingleTopActivity"
android:launchMode=“singleTop”
android:taskAffinity=“task.test2” />
<activity
android:name=".SingleTaskActivity"
android:launchMode=“singleTask”
android:taskAffinity=“task.test3” />
<activity
android:name=".SingleInstanceActivity"
android:launchMode=“singleInstance”
android:taskAffinity=“task.test4” />
从概念上讲,具有相同 taskAffinity 的 Activity 归属于同一任务栈(实际上并不一定)。从用户的角度来看则是归属于同一“应用”,因为每种 taskAffinity 在最近任务列表中会各自独占一个列表项,看起来就像一个个单独的应用,而实际上这些列表项可能是来自于同个应用
4、启动模式
Activity 的启动模式是一个很复杂的难点,其决定了要启动的 Activity 和任务栈还有返回栈之间的关联关系,直接影响到了用户的直观感受
启动模式就由 launchMode 和 Intent flag 这两者来共同决定,我们可以通过两种方式来进行定义:
-
在 AndroidManifest 文件中为 Activity 定义 launchMode 属性值,一共包含四种类型的属性值
-
当通过
startActivity(Intent)
启动 Activity 时,向Intent
添加或设置 flag 标记位,通过该 flag 来定义启动模式
如果只看四个 launchMode 的话其实并不难理解,可是再考虑多应用交互还有 Intent flag 的话,情况就会变得复杂很多,其复杂性和难点主要就在于:单个任务栈包含的 Activity 可以是来自于不同的应用、单个应用也可以包含多个任务栈、返回栈包含的多个任务栈之间也可以进行顺序切换、甚至任务栈中的 Activity 也可以被迁移到另外一个任务栈、Intent flag 可以多个组合使用
有些启动模式可通过 launchMode 来定义,但不能通过 Intent flag 定义,同样,有些启动模式可通过 Intent flag 定义,却不能在 launchMode 中定义。两者互相补充,但不能完全互相替代,且 Intent flag 的优先级会更高一些
5、launchMode
launchMode 一共包含以下四种属性值:
-
standard。默认模式。系统会在启动该 Activity 的任务栈中创建一个目标 Activity 的新实例,使该目标 Activity 成为任务栈的栈顶。该模式下允许先后启动多个相同的目标 Activity,一个任务栈可以拥有多个目标 Activity 实例,且不同 Activity 实例可以属于不同的任务栈
-
singleTop。