1.standard:標(biāo)準(zhǔn)模式劳翰,這是系統(tǒng)默認(rèn)的模式党涕,每次啟動(dòng)一個(gè)activity都會(huì)創(chuàng)建一個(gè)新的實(shí)例,不管這個(gè)實(shí)例是否存在。每次啟動(dòng)activity氯哮,它的onCreate、onStart土涝、onResume都會(huì)被調(diào)用砌梆。需要注意的是在這種模式下,誰(shuí)啟動(dòng)了這個(gè)activity,那么這個(gè)activity就運(yùn)行在啟動(dòng)它的那個(gè)activity的任務(wù)棧壶熏,正是因?yàn)檫@個(gè)原因句柠,不能用ApplicationContext(非activity類(lèi)型的context)來(lái)啟動(dòng)此模式下的activity。要想使用ApplicationContext來(lái)啟動(dòng)棒假,那必須給待啟動(dòng)的activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)記位溯职,這樣啟動(dòng)它的時(shí)候就會(huì)創(chuàng)建一個(gè)新的任務(wù)棧,實(shí)際上此時(shí)是以singleTask模式啟動(dòng)帽哑。
2.singleTop:棧頂復(fù)用模式谜酒。在這種模式下,如果activity已經(jīng)位于任務(wù)棧的棧頂妻枕,那么此activity不會(huì)被重新創(chuàng)建僻族,同時(shí)它的onNewIntent方法會(huì)回調(diào),通過(guò)此方法可以取出當(dāng)前請(qǐng)求的信息佳头。
3.singleTask:棧內(nèi)復(fù)用模式鹰贵,這是一種單實(shí)例模式,在這種模式下康嘉,只要Activity在一個(gè)棧中存在碉输,那么多次啟動(dòng)此activity都不會(huì)創(chuàng)建新的實(shí)例,和singleTop一樣亭珍,系統(tǒng)也會(huì)回調(diào)onNewIntent()方法敷钾。啟動(dòng)此模式的activity A時(shí)枝哄,系統(tǒng)會(huì)首先尋找是否存在A所需要的任務(wù)棧,如果存在需要的任務(wù)棧阻荒,再在該任務(wù)棧中尋找A的實(shí)例挠锥,如果該任務(wù)棧中存在A實(shí)例,那就把A調(diào)到棧頂并調(diào)用onNewIntent侨赡,如果該任務(wù)棧中不存在A實(shí)例蓖租,那么就創(chuàng)建A實(shí)例并把它放到該任務(wù)棧頂;如果不存在A所需要的任務(wù)棧羊壹,那就新創(chuàng)建一個(gè)任務(wù)棧蓖宦,并把新創(chuàng)的A實(shí)例放到棧中。
4.singleInstance:?jiǎn)螌?shí)例模式油猫。這是一種嘉加強(qiáng)的singleTask模式稠茂,它除了具有singleTask所有特性外,還加強(qiáng)了一點(diǎn)情妖,那就是此模式的activity只能單獨(dú)地位于一個(gè)任務(wù)棧中睬关。也就是說(shuō),當(dāng)該模式的activity A啟動(dòng)后毡证,系統(tǒng)會(huì)為它創(chuàng)建一個(gè)任務(wù)棧电爹,然后A獨(dú)自在這個(gè)新的任務(wù)棧中,由于棧內(nèi)復(fù)用的特性料睛,后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的實(shí)例藐不,除非該獨(dú)特的任務(wù)棧被系統(tǒng)銷(xiāo)毀。
TaskAffinity:Activity所需要的任務(wù)棧與TaskAffinity(任務(wù)相關(guān)性)有關(guān)秦效,這個(gè)參數(shù)標(biāo)識(shí)了一個(gè)activity所需要的任務(wù)棧的名字,默認(rèn)情況下涎嚼,所有activity所需的任務(wù)棧的名字為應(yīng)用的包名阱州。可以指定TaskAffinity屬性法梯,但不能跟應(yīng)用包名相同苔货。該屬性主要和singleTask啟動(dòng)模式或者allowTaskReparenting屬性配對(duì)使用。
(1)當(dāng)TaskAffinity和singleTask啟動(dòng)模式配對(duì)使用時(shí)立哑,它是具有該模式的Activity的目前任務(wù)棧的名字(任務(wù)棧名字為T(mén)askAffinity指定的)夜惭,待啟動(dòng)的activity會(huì)運(yùn)行在名字和TaskAffinity相同的任務(wù)棧中。
(2)當(dāng)TaskAffinity和allowTaskReparenting結(jié)合的時(shí)候铛绰,這種情況比較復(fù)雜诈茧。舉個(gè)例子,有應(yīng)用A和B捂掰,A啟動(dòng)了B中的Activity C,然后按Home鍵返回桌面敢会,再按B的應(yīng)用圖標(biāo)曾沈,此時(shí)并不是啟動(dòng)B的主Activity,而是重新顯示已經(jīng)被A啟動(dòng)的C鸥昏,或者說(shuō)C從A的任務(wù)棧轉(zhuǎn)移到B的任務(wù)棧塞俱。正常情況下,C是不可能跟A在同一個(gè)任務(wù)棧的(因?yàn)榘煌├艨澹援?dāng)B啟動(dòng)后障涯,B會(huì)創(chuàng)建自己的任務(wù)棧,這時(shí)系統(tǒng)發(fā)現(xiàn)C原本想要的任務(wù)棧已經(jīng)被創(chuàng)建膳汪,所以把C從A的任務(wù)棧轉(zhuǎn)移過(guò)來(lái)唯蝶。