首先要強(qiáng)調(diào)下玖雁,下邊兩個(gè)LaunchMode啟動(dòng)模式功能缀旁,已作區(qū)分:
當(dāng)一個(gè)Activity被設(shè)置為singletask時(shí)
(1)它并沒(méi)有創(chuàng)建新的任務(wù)棧(TaskId都是一樣的)
(2)如果它已經(jīng)存在于棧中记劈,再次請(qǐng)求觸發(fā)此Activity時(shí),會(huì)調(diào)用此類(lèi)實(shí)例的onNewIntent方法并巍,不會(huì)重新創(chuàng)建新的實(shí)例
(3)如果此類(lèi)所在的任務(wù)棧上面有其它Activity目木,那么其之上的Activity會(huì)全部出棧。當(dāng)一個(gè)Activity被設(shè)置為singleinstance時(shí)
(1)如果此Activity沒(méi)有實(shí)例履澳,它會(huì)創(chuàng)建一個(gè)新的任務(wù)棧嘶窄。(兩個(gè)TaskId不一樣)
(2)如果任務(wù)棧中已經(jīng)有此實(shí)例,會(huì)調(diào)用onNewIntent方法距贷,不會(huì)創(chuàng)建新的任務(wù)棧和實(shí)例
(3)獨(dú)立成Taskstack 柄冲,并且有且僅有你自己 。而且始終保持一個(gè)實(shí)例離棧的時(shí)候 忠蝗, 先退當(dāng)前的task 现横,再退另外的task
FLAG_ACTIVITY_NEW_TASK 比較標(biāo)準(zhǔn)解釋如下:
首先會(huì)查找是否存在和被啟動(dòng)的Activity具有相同的親和性的任務(wù)棧(即taskAffinity,注意同一個(gè)應(yīng)用程序中的activity的親和性相同)阁最,如果有戒祠,則直接把這個(gè)棧整體移動(dòng)到前臺(tái),并保持棧中舊activity的順序不變速种,然后被啟動(dòng)的Activity會(huì)被壓入棧姜盈,如果沒(méi)有,則新建一個(gè)棧來(lái)存放被啟動(dòng)的activity配阵,注意馏颂,默認(rèn)情況下同一個(gè)應(yīng)用中的所有Activity擁有相同的關(guān)系(taskAffinity).
個(gè)人理解:
默認(rèn)情況下同一個(gè)應(yīng)用中的所有Activity,都擁有相同的關(guān)系(taskAffinity)棋傍,即由FLAG_ACTIVITY_NEW_TASK開(kāi)啟的新Activity救拉,也都在同一個(gè)任務(wù)棧中(與Application相同的任務(wù)棧),若想使新Activity進(jìn)入不同棧中瘫拣,則還需要如下配置:
<activity
android:name=".ui.activity.OtherTaskActivityXXX"
android:taskAffinity="android.task.browser"/> //注意這里的 taskAffinity
并且在該OtherTaskActivityXXX頁(yè)面中亿絮,若再開(kāi)啟的其他頁(yè)面,那么所有的其他頁(yè)面,都將被壓入到這個(gè)新的任務(wù)棧中派昧。
查看任務(wù)棧Id:
int TaskId = mActivity.getTaskId();