概念
與 Activity 有著相似性的任務(wù)。從概念上講,具有同一相似性的 Activity 歸屬同一任務(wù)(從用戶的角度來看,則是歸屬同一“應(yīng)用”)。
默認(rèn)情況下,應(yīng)用中的所有 Activity 都具有同一相似性(即包名)。您可以設(shè)置該屬性,以不同方式將其分組,甚至可以在同一任務(wù)內(nèi)放置不同應(yīng)用中定義的 Activity。如要指定 Activity 與任何任務(wù)均無相似性,請將其設(shè)置為空字符串。
如果未設(shè)置該屬性,則 Activity 會繼承為application的相似性(taskAffinity屬性)。
分析
taskAffinity表示當(dāng)前activity具有親和力的一個任務(wù)(翻譯不是很準(zhǔn)確,原句為The task that the activity has an affinity for.),大致可以這樣理解,這個 taskAffinity表示一個任務(wù),這個任務(wù)就是當(dāng)前activity所在的任務(wù)。
在概念上,具有相同的affinity的activity(即設(shè)置了相同taskAffinity屬性的activity)屬于同一個任務(wù)。一個任務(wù)的affinity決定于這個任務(wù)的根activity(root activity)的taskAffinity。
這個屬性決定兩件事:當(dāng)activity被re-parent時,它可以被re-paren哪個任務(wù)中;當(dāng)activity以FLAG_ACTIVITY_NEW_TASK標(biāo)志啟動時,它會被啟動到哪個任務(wù)中。(這個比較 難以理解,請結(jié)合中的屬性allowTaskReparenting和Intent中的標(biāo)志 FLAG_ACTIVITY_NEW_TASK加以理解)
默認(rèn)情況下,activity未設(shè)置taskAffinity屬性,會從application中繼承taskAffinity屬性,若application未設(shè)置該屬性則默認(rèn)為包名。
為一個activity的taskAffinity設(shè)置一個空字符串,表明這個activity不屬于任何task。
可以利用該屬性對activity進行分組。
遇到的坑及解決方案
1.給activity設(shè)置android:taskAffinity=“”后,同一個App出現(xiàn)多個最近任務(wù)窗口
解決方案::
1)可以顯示配置為包名,如:android:taskAffinity=“${applicationId}”,打包時會自動替換為包名。
2)針對設(shè)置了singleTask啟動模式的Activity,通過設(shè)置addFlags方式啟動Activity
public static void toActClearTop(Context mContext, Class<?> cls,Bundle bundle) {
Intent intent = new Intent(mContext, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
//該方式替換singleTask啟動模式
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);
}