TaskAffinity是Activity的一个属性,用于指定Activity所属的任务栈(Task Stack)。TaskAffinity可以翻译为“任务相关性”或“任务亲和性”,标识了一个Activity所需要的任务栈的名字。
主要作用:
- 指定任务栈的名称:TaskAffinity属性可以指定一个字符串,用于标识任务栈的名称。不同的Activity可以使用相同的任务栈名称来指定它们属于同一个任务栈,从而在同一个任务栈中进行活动切换。
- 控制Activity的启动行为:TaskAffinity属性还可以影响Activity的启动行为,对于实现特定的导航和界面流程非常有用。例如,当TaskAffinity和singleTask启动模式配对使用时,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
- 实现Activity的迁移:TaskAffinity通常与allowTaskReparenting属性一起使用,用于实现把一个应用程序的Activity移到另一个应用程序的Task中。allowTaskReparenting属性用于配置是否允许Activity更换从属Task。
TaskAffinity属性的值必须是一个字符串,且中间必须含有包名分隔符“.”。如果一个Activity没有显式地指定TaskAffinity,那么TaskAffinity属性就等于Application指明的TaskAffinity;如果Application也没有指明,那么TaskAffinity的值就等于应用的包名。
启动新的Task:
Intent intent = new Intent(this,IntentTimeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
当AMS发现启动了一个FLAG_ACTIVITY_NEW_TASK标签的Activity时,会先去寻找当前是否存在这个Activity的task值,如果不存在的话,就会创建该task,如果存在就省去了创建 task这个步骤,然后在把要启动的Activity添加到task中。AMS分配的taskId是线性递增的,每次开启一个新的task,taskId进行+1的操作。
「allowTaskReparenting」是Activity的一个属性,用于配置是否允许该Activity更换从属的任务(Task)。当一个Activity设置了allowTaskReparenting属性,并且值为true时,该Activity可以从其启动的任务(Task)移动到由taskAffinity属性指定的任务(Task)中。如果allowTaskReparenting的值为false(默认值),Activity将保持在其启动的任务(Task)中,并在那里耗尽其整个生命周期。
<activity
android:name=".MainActivity"
android:allowTaskReparenting="true"/>
taskAffinity和allowTaskReparenting这两个属性会一起使用,实现将一个应用程序的Activity移动到另一个应用程序的任务(Task)中的功能。例如,当需要在多个应用程序之间共享某些Activity时。