淺談android:taskAffinity屬性及問題解決

概念

與 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屬性)。

分析

  1. 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ù)。

  2. 一個任務(wù)的affinity決定于這個任務(wù)的根activity(root activity)的taskAffinity。

  3. 這個屬性決定兩件事:當(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加以理解)

  4. 默認(rèn)情況下,activity未設(shè)置taskAffinity屬性,會從application中繼承taskAffinity屬性,若application未設(shè)置該屬性則默認(rèn)為包名。

  5. 為一個activity的taskAffinity設(shè)置一個空字符串,表明這個activity不屬于任何task。

  6. 可以利用該屬性對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);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容