android Activity的四種啓動模式詳講 singleTop standard singleTask singleInstance

 學習安卓也有好長時間了,對於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的實例。

發佈了38 篇原創文章 · 獲贊 60 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章