學習安卓也有好長時間了,對於activity的啓動模式還是有點模糊。找個個時間詳細的看了一下。順便總結一下。。
Activity的四種啓動模式爲:standard,singleTop,singleTask,singleInstance。
(一):standard(標準模式)
這個是默認的模式。activity是該模式時,每次啓動都會創建一個實例,放入啓動這個activity所在的棧中。
(二):singleTop(棧頂複用模式)
在該模式下,啓動這個activity時,會先判斷棧頂是不是這個activity的實例,如果是則不在創建新的activity,直接複用該實例。如果不是則會重新創建一個實例,放入棧中。複用就會執行onNewIntent()方法。
證明:1.有兩個activity。A和B,B的啓動模式爲singleTop。A-->B-->B. 打印的log如下:
可以發現,還是在這個棧中,並複用了該實例。
2.現在有三個activity:ABC,B的模式還是singleTop ,啓動步驟爲:A-->B-->C--B。log如下:
可以發現如果不在棧頂會重現創建一個實例
(三):singleTask(棧內複用模式)
在該模式下,啓動這個activity時,會先判斷棧內有沒有該實例,如果有則不再創建,把該實例提到棧頂,並把這個實例之上的實例全部出棧(亦可以說清除)。複用就會執行onNewIntent()方法。
這裏還有一個任務棧的問題,怎麼來確定放入哪個棧中(所有模式同理),啓動該activity的實例在哪個棧中就放入哪個棧,如果activity設置了taskAffinity(可以理解爲棧名)這個參數(必須有“.” ,系統默認的是應用的包名,)則會創建一個新棧來放該實例。
證明:有三個activity。ABC。A的啓動模式爲singleTask。啓動順序A-->B->C-->A。log如下:
發現複用的這個實例。當我按back時,發生了什麼????結果直接回到了桌面。這也可以證明把這個棧中A實例之上的實例全部出棧(亦可以說清除)。新建棧這個例子就不寫出來了。有興趣大家可以自己動手證明一下。。
(四):singleInstance(單實例模式)
在該模式下,啓動的activity會重新創建一個棧,放入其中,該activity獨享這一個棧。
證明:有ABC 三個activity,B和C模式爲singleInstance。執行順序爲A-->B-->C-->B。log如下:
很明顯可以看出不在一個棧中,最後啓動B時會複用B的實例。