概述
在默認情況下,當我們多次啓動同一個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。