我們知道,在默認情況下,當我們多次啓動同一個Activity的時候,系統會重複創建多個實例。Android在設計的時候提供了啓動模式來修改系統的默認行爲。目前有四種啓動模式:standard、singleTop、singleTask和singleInstance。
一、standard(標準模式)
這是系統的默認模式,每次啓動Activity都會重新創建一個新的實例,不管這個實例是否已經存在。被創建的實例的生命週期,它的onCreate、onStart、onResume都會被調用。這是一種典型的多實例實現,一個任務棧中可以有多個實例,每個實例也可以屬於不同的任務棧。在這種模式下,誰啓動了這個Activity,那麼這個Activity就運行在啓動它的那個Activity所在的棧中。
二、singleTop(棧頂複用模式)
在這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時它的onNewIntent方法會被回調,通過此方法的參數我們可以取出當前請求的信息。需要注意的是,這個Activity的onCreate、onStart不會被系統調用,因爲它並沒有發生改變。如果新Activity的實例已存在但不是位於棧頂,那麼新Activity仍然會重新創建。
三、singleTask(棧內複用模式)
這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啓動此Activity都不會重新創建實例,和singleTop一樣,系統也會回調其onNewIntent。具體一點,當一個具有singleTask模式的Activity請求啓動後,比如Activity A,系統首先會尋找是否存在A想要的任務棧,如果不存在,就重新創建一個任務棧,然後創建A的實例後把A放到棧中。如果存在A所需的任務棧,這時要看A是否在棧中有實例存在,如果有實例存在,那麼系統就會把A調到棧頂並調用它的onNewIntent方法,如果實例不存在,就創建A的實例並把A壓入棧中。
四、singleInstance(單實例模式)
這是一種加強的singleTask模式,它除了具有singleTask模式的所有特性外,還加強了一點,那就是具有此模式的Activity只能單獨地位於一個任務棧中,換句話說,比如Activity A是singleInstance模式,當A啓動後,系統會爲它創建一個新的任務棧,然後A獨自在這個新的任務棧中,由於棧內複用的特性,後續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷燬了。
使用方法
一、通過AndroidMenifest爲Activity指定啓動模式:android:launchMode="singleTask"
二、通過在Intent中設置標誌位來爲Activity指定啓動模式 : intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
這兩種方法都可以爲Activity指定啓動模式,但是二者還是有區別的。首先,優先級上,第二種方式的優先級要高於第一種,當兩種同時存在時,以第二種爲準;其次,上述兩種方式在限定範圍上有所不同,比如,第一種方式無法直接爲Activity設定FLAG_ACTIVITY_CLEAR_TOP
標識 ,而第二種方式無法爲Activity指定singInstance模式。
結束語
沒有任何動物比螞蟻更勤奮,然而它卻最沉默寡言 —— 富蘭克林