Android12 新的啟動(dòng)模式launchMode="singleInstancePerTask"
新的啟動(dòng)模式singleInstancePerTask
Android 大家熟知的啟動(dòng)模式
standard 標(biāo)準(zhǔn)模式
我們每次新建Activity的時(shí)候,默認(rèn)就是standard 標(biāo)準(zhǔn)模式,不管返回棧中有沒(méi)有都會(huì)新建一個(gè)Activity放在棧頂, 即使棧頂存在也會(huì)新建。
singleTop 單個(gè)棧頂模式
如果返回棧的棧頂存在,則不新建,直接顯示給用戶(hù),如果棧頂不存在就新建并放在棧頂,可以理解為只看棧頂
singleTask 單棧單例模式
如果當(dāng)前返回棧中存在,不管是在棧的什么位置,都不會(huì)新建,會(huì)把它上面的全部出棧,它直接顯示在棧頂
singleInstance 獨(dú)棧單例模式
為什么是獨(dú)棧呢?,因?yàn)槿绻麊?dòng)模式是singleInstance 的話(huà),Android會(huì)為當(dāng)前Activity 新建一個(gè)單獨(dú)的棧,方便被其他應(yīng)用來(lái)調(diào)用,當(dāng)前任務(wù)棧中僅有這一個(gè)Activity
思考:存在跳轉(zhuǎn)邏輯:ActivityA(standard ) 跳轉(zhuǎn)到 ActivityB(singleInstance ) 跳轉(zhuǎn)到 ActivityC(standard ),按Back鍵,頁(yè)面的顯示邏輯是怎樣的呢?
Android 12 新增的啟動(dòng)模式singleInstancePerTask
singleInstancePerTask 每個(gè)任務(wù)的單例模式
Android12新增的對(duì)于singleInstancePerTask描述如下:
<!-- The activity can only be running as the root activity of the task, the first activity
that created the task, and therefore there will only be one instance of this activity
in a task. In constrast to the {@code singleTask} launch mode, this activity can be
started in multiple instances in different tasks if the
{@code FLAG_ACTIVITY_MULTIPLE_TASK } or {@code FLAG_ACTIVITY_NEW_DOCUMENT} is set.-->`
<enum name="singleInstancePerTask" value="4" />
百度翻譯:
該活動(dòng)只能作為任務(wù)的根活動(dòng)(創(chuàng)建任務(wù)的第一個(gè)活動(dòng))運(yùn)行,
因此任務(wù)中只能有一個(gè)此活動(dòng)的實(shí)例。與{@code singleTask}啟動(dòng)模式不同,
如果設(shè)置了{@ccode FLAG_activity_MUNIPLE_TASK}或{@codeFLAG_ACTIVETY_NEW_DOCUMENT},
則可以在不同任務(wù)的多個(gè)實(shí)例中啟動(dòng)此活動(dòng)
默認(rèn)作用和singleTask相似,不同的在于singleInstancePerTask不需要設(shè)置一個(gè)不同的taskAffinity即可創(chuàng)建新的Task。
另外結(jié)合Intent.FLAG_ACTIVITY_MULTIPLE_TASK和Intent.FLAG_ACTIVITY_NEW_DOCUMENT,每次啟動(dòng)了launchMode設(shè)置為“singleInstancePerTask”的Activity都可以創(chuàng)建一個(gè)新的Task,那么這個(gè)新啟動(dòng)的Activity自然就是這個(gè)新創(chuàng)建的Task的root Activity。singleInstancePerTask是singleTask的擴(kuò)展,這個(gè)Activity可以有多個(gè)實(shí)例,但是每個(gè)都是所在的Task的root Activity。