TaskAffinity屬性對應用程序任務棧和啟動行為的影響
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時。