Android Activity啓動模式總結

簡介

Activity 做爲 Android 四大組件之一,幾乎是被接觸得最多的。Activity 中有個啓動模式的概念,分別是 standardsingleTopsingleTask 以及 singleinstance,這篇文章總結一下這四種啓動模式的特色。html

任務棧

當咱們打開一個 APP,第一個出現的 Activity 是咱們指定的默認 Activity,經過這個 Activity 能夠跳轉到其它 Activity,按返回鍵能夠依次返回到上一個 Activity。這是由於系統把咱們打開的 Activity 放在一個任務棧中。打開第一個 Activity 時,系統會新建一個任務棧,若是繼續打開新的 Activity,會建立新 Activity 的實例而且放到任務棧的棧頂,返回時將棧頂的 Activity 出棧,新的棧頂 Activity 將呈如今界面上,過程以下圖。android

圖片描述

這是默認狀況下的任務的入棧出棧,若是指定了不一樣的啓動模式將會有不一樣的表現。ide

standard

standard 是標準啓動模式,當咱們沒有指定 Activity 的啓動模式時,默認就是這種模式。在 standard 模式下,每次啓動一個 Activity 都會建立一個新的實例,它的 onCreateonStart 以及 onResume均會被調用。這個新建立的 Activity將會放在啓動它的 Activity 所在的任務棧的棧頂。ui

  • 好比 Activity A 在棧 S ,它啓動了 Activity B(standard 模式),那麼 B 將會進入 A 所在的棧 S。
  • 若是在沒有任務棧的狀況下啓動 standard 模式的 Activity,好比在 Service 中,此時新的 Activity 沒有任務棧可入,會出現異常:
    Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

    此時應該爲這個 Activity 指定 FLAG_ACTIVITY_NEW_TASK,這樣就會新建一個任務棧。this

singleTop

singleTop 是棧頂複用模式。在這種模式下,若是新啓動的 Activity 已經在任務棧的棧頂了,那麼就不會從新建立新的實例,而是調用這個 Activity 的 onPauseonNewIntent 以及 onResume 方法。若是新啓動的 Activity 不是位於棧頂,那麼仍是會從新建立。spa

  • 好比如今棧內狀況是 ABCD 四個Activity,A 位於棧底,D 位於棧頂。若是 D 的啓動模式爲 singleTop,那麼不會再次建立 D 的實例,棧內依然是 ABCD。
  • 若是上面的 D 爲 standard 啓動模式,那麼棧內將變爲 ABCDD。

singleTask

singleTask 是棧內複用模式。這是最複雜的一種模式,由於它可能涉及到多個棧。當一個具備 singleTask 模式的 Activity 啓動後,好比 Activity A,系統會首先尋找是否存在所需的任務棧,若是不存在,就從新建立一個任務棧,而後建立 A 的實例後把 A 放入到棧中。若是存在 A 所須要的任務棧,這時要看 A 是否在棧中有實例存在,若是有,那麼系統就會把它調到棧頂而且調用它的 onNewIntent 方法,若是不存在,就建立 A 的實例並把 A 壓入棧中。這裏所說的 A 所須要的任務棧是什麼意思呢?其實 Activity 是能夠指定本身想要的任務棧的名字的,經過一個參數:TaskAffinity,默認狀況下,全部的 Activity 所須要的任務棧的名字爲應用的包名。3d

  • 若是任務棧 S1 中的狀況爲 ABC,這個時候 Activity D 以 singleTask 模式請求啓動,它須要的任務棧爲 S2,因爲 S2 和 D 的實例均不存在,因此係統就會先建立任務棧 S2,而後在建立 D 的實例並將其入棧到 S2
  • 若是上面 D 所需的任務棧爲 S1,那麼由於 S1 已經存在,因此係統直接建立 D 的實例而且入棧到 S1。
  • 若是 D 所需的任務棧爲 S1,可是 S1 中的狀況爲 ADBC,此時 D 不會從新建立,而是把 D 切換到棧頂並調用 onNewIntent 方法。那 B 和 C 怎麼辦? 它們會所有出棧,至關於 clearTop 效果。

singleInstance

singleInstance 是單實例模式。這種模式是 singleTask 的增強版,它除了具備 singleTask 的全部特性外,還增強了一點,那就是此種模式的 Activity 只能單獨位於一個任務棧中。code

  • 好比 Activity A 是 singleInstance 模式,當 A 啓動後,系統會建立一個新的任務棧,而後 A 獨自在這個新的任務棧中,因爲棧內複用的特性,後續的請求均不會建立新的 Activity,除非這個棧被銷燬了。

總結

Activity 的四種啓動模式就是這樣,除了 singleTask 稍微有點複雜,其它都很好理解。有的時候會出現多個任務棧的狀況,好比如今有兩個任務棧(以下圖),前臺的任務棧狀況爲 Activity1 和 Activity2, 然後臺任務棧的狀況爲 ActivityX 和 ActivityY,假設 XY 的啓動模式均爲 singleTAsk。如今啓動Y, 那麼整個後臺任務棧都被切換到前臺,這時候的後退列表變爲 12XY。當按返回鍵的時候,Activity 會依次出棧。component

圖片描述

參考htm

  1. Android 開發藝術探索
  2. http://developer.android.com/...

若是個人文章對您有幫助,不妨點個贊鼓勵一下(^_^)

相關文章
相關標籤/搜索