standard
標(biāo)準(zhǔn)啟動模式,也是Android的默認啟動模式。在這種模式下啟動的activity可以被多次實例化,即在一個任務(wù)中可以存在多個activity實例,每個實例都會處理一個Intent對象。如果Activity A的啟動模式為standard,并且A已經(jīng)啟動,在A中再次啟動Activity A,即調(diào)用startActivity(new Intent(this,A.class)),會在A的上面再次啟動一個A的實例,即當(dāng)前的棧中的狀態(tài)為A-->A。
singleTop
如果一個以singleTop模式啟動的activity的實例已經(jīng)存在于任務(wù)棧的棧頂,那么再次啟動這個activity時,不會創(chuàng)建新的實例,而是重用位于棧頂?shù)哪莻€實例,并且會調(diào)用該實例的onNewIntent()方法將Intent對象傳遞到這個實例中。
如果以singleTop模式啟動的activity的一個實例已經(jīng)存在于任務(wù)棧中,但是不在棧頂,那么它的行為和standard模式相同,也會創(chuàng)建多個實例。
singleTask
官方文檔上稱,如果一個activity的啟動模式為singleTask,那么系統(tǒng)總會在一個新的任務(wù)的最底部(root)啟動這個activity,并且被這個activity啟動的其它activity會和該activity同時存在于這個新任務(wù)中。如果系統(tǒng)中已經(jīng)存在一個這樣的activity則會重用這個實例,并且調(diào)用它的onNewIntent()方法。即,這樣的一個activity在系統(tǒng)中只會存在一個實例。
但是這種說法并不準(zhǔn)確,采用singleTask啟動目標(biāo)Activity時,可分三種情況:
1、如果將要開啟的目標(biāo)Activity不存在,系統(tǒng)將會創(chuàng)建目標(biāo)Activity實例,并將它放入Task棧頂。
2、如果將要啟動的目標(biāo)Activity已經(jīng)位于Task棧頂,此時與singleTop模式的行為相同。
3、如果將要啟動的目標(biāo)Activity已經(jīng)存在、但沒有位于Task棧頂,系統(tǒng)將會把位于該Activity上面的所有Activity移出Task棧,從而使得目標(biāo)Activity轉(zhuǎn)入棧頂。
singleInstance
總是在新的任務(wù)中開啟,并且這個新的任務(wù)中有且只有這一個實例,也就是說被該實例啟動的其他activity會自動運行于另一個任務(wù)中。當(dāng)再次啟動該activity的實例時,會重用已存在的任務(wù)和實例。并且會調(diào)用這個實例的onNewIntent()方法,將Intent實例傳遞到該實例中。和singleTask相同,同一時刻在系統(tǒng)中只會存在一個這樣的Activity實例。
說明:
這種加載模式下,系統(tǒng)保證無論從哪個Task中啟動目標(biāo)Activity,只會創(chuàng)建一個目標(biāo)Activity實例,并會使用一個全新的Task棧來裝載該Activity實例。
當(dāng)用singleInstance啟動目標(biāo)Activity時,分兩種情況:
1、當(dāng)將要啟動的目標(biāo)Activity不存在,系統(tǒng)會先創(chuàng)建一個全新的Task、再創(chuàng)建目標(biāo)Activity的實例,并將它加入新的Task的棧頂。
2、如果將要啟動的目標(biāo)Activity已經(jīng)存在,無論它位于哪個應(yīng)用程序中,無論它位于哪個Task中,系統(tǒng)將會把該Activity所在的Task轉(zhuǎn)到前臺,從而使用該Activity顯示出來。
采用該模式加載的Activity總是位于Task棧頂,所在Task只包含該Activity.
activity返回鍵退棧順序
首先是task順序,然后是task里activity的順序。
例如task0(A-B)task1(C-D),不管如何啟動的,退棧順序就是D-C-B-A.