一篇文章搞懂 Activity 啓動模式

本文大部分翻譯自 《Android 「launchMode」 (Visualized)》, 並結合本身的理解在 SingleInstance 中添加了補充內容html

啓動模式 是很重要的一塊知識點,每位安卓開發都應該瞭解它是如何運做的。大部分的開發者(包括我本身)認爲咱們已經知道了如何來使用 啓動模式。可是其實咱們錯了。不單單是知道將 Activity 設置爲 SingleTask 來防止重複實例化就足夠了,雖然大部分狀況下這已經解決了咱們的業務需求。可是咱們真的瞭解當咱們將一個 Activity 設置爲 SingleTask 時,它是如何影響 Activity 任務棧內其餘 Activites 的嗎?android

本文將圖文的模式來說解 4 中啓動模式的做用及區別。首先須要來說解如下圖片的做用來幫助你更容易理解下面的內容ide

綠色表明在 Activity 任務棧中建立了一個新的 Activity 實例
黃色則表明複用了以前建立的 Activity 實例,可是該 Activity 的 onNewIntent() 方法將會被調用ui

Standard 啓動模式講解

若是在 AndroidManifest.xml 中將 Activity B 的啓動模式設置爲 Standard,無論任務棧內是否已經存在 Activity B 的實例,當啓動 Activity B 時,都會建立一個嶄新的 Activity B 位於任務棧頂翻譯

SingleTask 模式講解

若是在 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

SingleTop 啓動模式講解

若是在 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

SingleInstance 模式講解

若是在 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 會單獨存在於一個任務棧中

參考

相關文章
相關標籤/搜索