Activity 做爲 Android 四大組件之一,幾乎是被接觸得最多的。Activity 中有個啓動模式的概念,分別是 standard
、singleTop
、singleTask
以及 singleinstance
,這篇文章總結一下這四種啓動模式的特色。html
當咱們打開一個 APP,第一個出現的 Activity 是咱們指定的默認 Activity,經過這個 Activity 能夠跳轉到其它 Activity,按返回鍵能夠依次返回到上一個 Activity。這是由於系統把咱們打開的 Activity 放在一個任務棧中。打開第一個 Activity 時,系統會新建一個任務棧,若是繼續打開新的 Activity,會建立新 Activity 的實例而且放到任務棧的棧頂,返回時將棧頂的 Activity 出棧,新的棧頂 Activity 將呈如今界面上,過程以下圖。android
這是默認狀況下的任務的入棧出棧,若是指定了不一樣的啓動模式將會有不一樣的表現。ide
standard
是標準啓動模式,當咱們沒有指定 Activity 的啓動模式時,默認就是這種模式。在 standard
模式下,每次啓動一個 Activity 都會建立一個新的實例,它的 onCreate
、onStart
以及 onResume
均會被調用。這個新建立的 Activity將會放在啓動它的 Activity 所在的任務棧的棧頂。ui
standard
模式),那麼 B 將會進入 A 所在的棧 S。standard
模式的 Activity,好比在 Service 中,此時新的 Activity 沒有任務棧可入,會出現異常:此時應該爲這個 Activity 指定 FLAG_ACTIVITY_NEW_TASK
,這樣就會新建一個任務棧。this
singleTop
是棧頂複用模式。在這種模式下,若是新啓動的 Activity 已經在任務棧的棧頂了,那麼就不會從新建立新的實例,而是調用這個 Activity 的 onPause
、onNewIntent
以及 onResume
方法。若是新啓動的 Activity 不是位於棧頂,那麼仍是會從新建立。spa
singleTop
,那麼不會再次建立 D 的實例,棧內依然是 ABCD。standard
啓動模式,那麼棧內將變爲 ABCDD。singleTask
是棧內複用模式。這是最複雜的一種模式,由於它可能涉及到多個棧。當一個具備 singleTask
模式的 Activity 啓動後,好比 Activity A,系統會首先尋找是否存在所需的任務棧,若是不存在,就從新建立一個任務棧,而後建立 A 的實例後把 A 放入到棧中。若是存在 A 所須要的任務棧,這時要看 A 是否在棧中有實例存在,若是有,那麼系統就會把它調到棧頂而且調用它的 onNewIntent
方法,若是不存在,就建立 A 的實例並把 A 壓入棧中。這裏所說的 A 所須要的任務棧是什麼意思呢?其實 Activity 是能夠指定本身想要的任務棧的名字的,經過一個參數:TaskAffinity
,默認狀況下,全部的 Activity 所須要的任務棧的名字爲應用的包名。3d
singleTask
模式請求啓動,它須要的任務棧爲 S2,因爲 S2 和 D 的實例均不存在,因此係統就會先建立任務棧 S2,而後在建立 D 的實例並將其入棧到 S2onNewIntent
方法。那 B 和 C 怎麼辦? 它們會所有出棧,至關於 clearTop 效果。singleInstance
是單實例模式。這種模式是 singleTask
的增強版,它除了具備 singleTask
的全部特性外,還增強了一點,那就是此種模式的 Activity 只能單獨位於一個任務棧中。code
singleInstance
模式,當 A 啓動後,系統會建立一個新的任務棧,而後 A 獨自在這個新的任務棧中,因爲棧內複用的特性,後續的請求均不會建立新的 Activity,除非這個棧被銷燬了。Activity 的四種啓動模式就是這樣,除了 singleTask
稍微有點複雜,其它都很好理解。有的時候會出現多個任務棧的狀況,好比如今有兩個任務棧(以下圖),前臺的任務棧狀況爲 Activity1 和 Activity2, 然後臺任務棧的狀況爲 ActivityX 和 ActivityY,假設 XY 的啓動模式均爲 singleTAsk。如今啓動Y, 那麼整個後臺任務棧都被切換到前臺,這時候的後退列表變爲 12XY。當按返回鍵的時候,Activity 會依次出棧。component
參考htm
若是個人文章對您有幫助,不妨點個贊鼓勵一下(^_^)