本文大部分翻譯自 《Android 「launchMode」 (Visualized)》, 並結合本身的理解在
SingleInstance
中添加了補充內容html
啓動模式
是很重要的一塊知識點,每位安卓開發都應該瞭解它是如何運做的。大部分的開發者(包括我本身)認爲咱們已經知道了如何來使用 啓動模式
。可是其實咱們錯了。不單單是知道將 Activity 設置爲 SingleTask
來防止重複實例化就足夠了,雖然大部分狀況下這已經解決了咱們的業務需求。可是咱們真的瞭解當咱們將一個 Activity 設置爲 SingleTask
時,它是如何影響 Activity 任務棧內其餘 Activites 的嗎?android
本文將圖文的模式來說解 4 中啓動模式
的做用及區別。首先須要來說解如下圖片的做用來幫助你更容易理解下面的內容ide
綠色表明在 Activity 任務棧中建立了一個新的 Activity 實例
黃色則表明複用了以前建立的 Activity 實例,可是該 Activity 的onNewIntent()
方法將會被調用ui
若是在
AndroidManifest.xml
中將 Activity B 的啓動模式設置爲 Standard,無論任務棧內是否已經存在 Activity B 的實例,當啓動 Activity B 時,都會建立一個嶄新的 Activity B 位於任務棧頂翻譯
若是在
AndroidManifest.xml
中將 Activity C 的啓動模式設置爲 SingleTask,若是此時任務棧內已經存在 Activity C 的實例且未位於棧頂,當啓動 Activity C 時,會將 Activity C 上方的實例所有出棧讓其位於任務棧頂並 Activity C 中的onNewIntent()
方法會被調用3d
若是在
AndroidManifest.xml
中將 Activity C 的啓動模式設置爲 SingleTask,而且此時任務棧內並不存在 Activity C 的實例,當啓動 Activity C 時,會建立一個嶄新的 Activity C 實例在棧頂code
若是在
AndroidManifest.xml
中將 Activity D 的啓動模式設置爲 SingleTop 而且任務棧內存在 Activity D 實例且位於棧頂時,當啓動 Activity D 時,會複用以前建立的 Activity D 的實例,而且onNewIntent()
方法被調用cdn
若是在
AndroidManifest.xml
中將 Activity D 的啓動模式設置爲 SingleTop 而且任務棧內並不存在 Activity D 的實例時,當啓動 Activity D 時,會建立一個嶄新的 Activity D 實例在棧頂xml
若是在
AndroidManifest.xml
中將 Activity D 的啓動模式設置爲 SingleTop 而且任務棧內存在 Activity D 的實例但其實例未在棧頂時,當啓動 Activity D 時,會再次建立一個嶄新的 Activity D 實例在棧頂htm
若是在
AndroidManifest.xml
中將 Activity E 的啓動模式設置爲 SingleInstance,而且任務棧內不存在 Activity E 的實例,當啓動 Activity E 時,會在建立一個新的任務棧,而且棧內只有 Activity E 一個實例
若是此時基於上面的任務棧,從 Activity D 中開啓一個啓動模式爲 Standard
的 Activity F,那任務棧會發生什麼樣的變化呢?請看下圖
此時 Activity E 依舊會獨立的存在於本身的任務棧中,而新建立的 Activity F 將會和 Activity D 位於相同的任務棧的棧頂
若是啓動模式爲
SingleInstance
的 Activity E 已經獨立存在於本身的任務棧中,此時再啓動 Activity E, 則會複用已經建立的 Activity E 的實例,而且 Activity E 的onNewIntent()
方法被調用
若是基於上面的任務棧,從 Activity E 中開啓一個啓動模式爲 Standard
的 Activity F,那任務棧會發什麼樣的變化呢,請看下圖
由於
singleInstance
的屬性是禁止與其餘 Activities 共享任務棧,因此啓動模式爲SingleInstance
的 Activity 啓動其餘 Activity 時會默認帶有FLAG_ACTIVITY_NEW_TASK
屬性。因此 Activity E 啓動 Activity F 後,最後會存在三個任務棧,Activity F 會單獨存在於一個任務棧中