參考文獻(xiàn):
https://juejin.cn/post/6987002152191426568#heading-2
對NEW_TASK的理解
Intent.FLAG_ACTIVITY_NEW_TASK這個(gè)flag是一個(gè)非常重要的flag,實(shí)際上,NEW_TASK這個(gè)flag可以看做一種權(quán)限:NEW_TASK不是代表新建一個(gè)Task赘来,而是代表可以選擇一個(gè)不同于當(dāng)前所在Task的目標(biāo)Task歼捏,即NEW的含義為不同于當(dāng)前Task,而這個(gè)目標(biāo)Task通過taskAffinity指定(沒有顯式地在Manifest中指定的話痊硕,默認(rèn)為包名)。
1. 為什么SingleTask和SingleInstance不需要NEW_TASK?
答案是盟萨,系統(tǒng)自動(dòng)將NEW_TASK添加上了。在Activity的啟動(dòng)流程中了讨,ActivityStarter的startActivityInner方法會(huì)被回調(diào)捻激,在該方法的一開始會(huì)調(diào)用一個(gè)computeLaunchingTaskFlags()方法對Intent的Flag進(jìn)行加工處理:
private void computeLaunchingTaskFlags() {
...
// 表明是非Activity啟動(dòng)的目標(biāo)Activity
if (mSourceRecord == null) {
if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0 && mInTask == null) {
// 此時(shí)必須添加NEW_TASK
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
}
} else if (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) {
// 表明啟動(dòng)目標(biāo)Activity的Source Activity的啟動(dòng)模式是SINGLE_INSTANCE,即他的Task被獨(dú)占了前计,此時(shí)目標(biāo)Activity必須添加NEW_Task
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
} else if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
// 表明目標(biāo)Activity的啟動(dòng)模式是SINGLE_INSTANCE或者SINGLE_TASK胞谭,此時(shí)需要添加NEW_TASK
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
}
}
2. 為什么SingleTask和SingleInstance系統(tǒng)提供支持,而其他兩種模式不默認(rèn)支持呢男杈?
官方這么設(shè)計(jì)的原因丈屹,猜測是因?yàn)镾ingleTask和SingleInstance這兩種啟動(dòng)模式下,一旦Activity命中了势就,都會(huì)有一個(gè)清除Task棧頂或者整個(gè)清除Task棧的動(dòng)作泉瞻,這樣一來就會(huì)對Task棧中的其他Activity造成影響,因此苞冯,這種后果需要由開發(fā)者主動(dòng)選擇是否開啟NEW_TASK承擔(dān)袖牙。而根據(jù)參考文獻(xiàn)中所述,CLEAR_TASK舅锄、CLEAR_TOP這類具有清除Task效果的標(biāo)識鞭达,想要起作用,都需要配合NEW_TASK來使用皇忿,因此可以看出NEW_TASK正代表著一種權(quán)限畴蹭,這種權(quán)限表明了開發(fā)者選擇在taskAffinity標(biāo)識的Task上啟動(dòng)Activity,由此可能造成的清除Task的后果鳍烁,由開發(fā)者承擔(dān)叨襟。
3. Activity一定會(huì)在taskAffinity指定的Task上啟動(dòng)嗎?
這個(gè)不一定幔荒,如果taskAffinity標(biāo)識的Task被一個(gè)SingleInstance模式啟動(dòng)的Activity先一步占領(lǐng)了糊闽,這時(shí)目標(biāo)Activity會(huì)在一個(gè)新建的Task上啟動(dòng)梳玫,無論是使用CLEAR_TASK還是以SingleInstance模式啟動(dòng),都不會(huì)對原來的Activity造成影響右犹。