Android——Activity啓動模式總結

概述

在默認情況下,當我們多次啓動同一個Activity 的時候,系統會創建多個實例並把它們一一放入任務棧中, 當我們單擊back鍵,會發現這些Activity會一一回退。

我們可能會發現一個問題多次啓動同一個Activity,系統會重複創建多個實例。

Android在設計的時候不可能不考慮到這個問題,所以它提供了啓動模式來修改系統的默認行爲。目前有四種啓動模式: standard、 singleTop、 singleTask 和singleInstance。

standard

標準模式。

這也是系統的默認模式。每次啓動一個Activity都會重新創建一個新的實例,不管這個實例是否存在。創建的實例的聲明週期符合典型情況下的Activity的聲明週期。

在這種模式下,誰啓動了這個Activity,那麼這個Activity就運行在啓動他的Activity所在的棧中。

當我們用ApplicationContext 去啓動standard 模式的Activity會報錯,是因爲standard模式的Activity默認會進入啓動他的Activity棧,但是非Activity類型的Context並沒有所謂的任務棧。解決這個問題的方法就是爲待啓動的Activity指定FLAG_ACTIVITY_NEW_TASK標誌位。這樣啓動的時候就會開啓一個新的任務棧。

singleTop

棧頂複用模式。

這種模式下,如果新的Activity已經位於任務棧的棧頂,那麼此Activity不會重新創建。同時它的onNewIntent方法會被回調,通過此方法的參數我們可以取出當前請求的信息。

singleTask

棧內複用模式。

這種模式下,只要Activity在一個棧中存在,那麼多次啓動此Activity都不會重新創建實例,系統會回調其onNewIntent方法。

該模式的Activity請求啓動後,系統首相會尋找是否存在有此Activity需要的任務棧,如果不存在,就重新創建一個任務棧,然後創建實例並放入棧中。

如果存在所需的任務棧,這是要看是否存在他的實例,如果有實例,就把他調到棧頂並調用他的onNewIntent方法。如果不存在,就創建實例並放入棧中。

例子:

  • 比如目前任務棧S1中的情況爲ABC,這個時候Activity D以singleTask模式請求啓動,其所需要的任務棧爲S2,由於S2和D的實例均不存在,所以系統會先創建任務棧S2,然後再創建D的實例並將其入棧到S2。
  • 另外一種情況,假設D所需的任務棧爲S1,其他情況如上面例子1所示,那麼由於S1已經存在,所以系統會直接創建D的實例並將其入棧到S1.
  • 如果D所需的任務棧爲S1,並且當前任務棧S1的情況爲ADBC,根據棧內複用的)原則,此時D不會重新創建,系統會把D切換到棧頂並調用其onNewIntent方法,同時由於singleTask默認具有clearTop的效果,會導致棧內所有在D上面的Activity全部出棧,於是最終S1中的情況爲AD。

singleInstance

單實例模式。

這是一種加強的singleTask模式。他除了具有singleTask模式所有的特性外,還加強了一點,就是此種模式的Activity只能單獨位於一個任務棧中。

比如A是singleInstance模式,當A啓動後,系統會給他創建一個新的任務棧,然後獨自在這個新的任務棧中。由於棧內複用的特性,後續的請求均不會創建新的Activity。

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