Android Activity启动模式总结
簡介
Activity 作為 Android 四大組件之一,幾乎是被接觸得最多的。Activity 中有個啟動模式的概念,分別是 standard、singleTop、singleTask 以及 singleinstance,這篇文章總結一下這四種啟動模式的特點。
任務棧
當我們打開一個 APP,第一個出現的 Activity 是我們指定的默認 Activity,通過這個 Activity 可以跳轉到其它 Activity,按返回鍵可以依次返回到上一個 Activity。這是因為系統把我們打開的 Activity 放在一個任務棧中。打開第一個 Activity 時,系統會新建一個任務棧,如果繼續打開新的 Activity,會創建新 Activity 的實例并且放到任務棧的棧頂,返回時將棧頂的 Activity 出棧,新的棧頂 Activity 將呈現在界面上,過程如下圖。
這是默認情況下的任務的入棧出棧,如果指定了不同的啟動模式將會有不同的表現。
standard
standard 是標準啟動模式,當我們沒有指定 Activity 的啟動模式時,默認就是這種模式。在 standard 模式下,每次啟動一個 Activity 都會創建一個新的實例,它的 onCreate、onStart 以及 onResume均會被調用。這個新創建的 Activity將會放在啟動它的 Activity 所在的任務棧的棧頂。
- 比如 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,這樣就會新建一個任務棧。
singleTop
singleTop 是棧頂復用模式。在這種模式下,如果新啟動的 Activity 已經在任務棧的棧頂了,那么就不會重新創建新的實例,而是調用這個 Activity 的 onPause、onNewIntent 以及 onResume 方法。如果新啟動的 Activity 不是位于棧頂,那么還是會重新創建。
- 比如現在棧內情況是 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 所需要的任務棧的名字為應用的包名。
- 如果任務棧 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 只能單獨位于一個任務棧中。
- 比如 Activity A 是 singleInstance 模式,當 A 啟動后,系統會創建一個新的任務棧,然后 A 獨自在這個新的任務棧中,由于棧內復用的特性,后續的請求均不會創建新的 Activity,除非這個棧被銷毀了。
總結
Activity 的四種啟動模式就是這樣,除了 singleTask 稍微有點復雜,其它都很好理解。有的時候會出現多個任務棧的情況,比如現在有兩個任務棧(如下圖),前臺的任務棧情況為 Activity1 和 Activity2, 而后臺任務棧的情況為 ActivityX 和 ActivityY,假設 XY 的啟動模式均為 singleTAsk。現在啟動Y, 那么整個后臺任務棧都被切換到前臺,這時候的后退列表變為 12XY。當按返回鍵的時候,Activity 會依次出棧。
參考
如果我的文章對您有幫助,不妨點個贊鼓勵一下(^_^)
總結
以上是生活随笔為你收集整理的Android Activity启动模式总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] 中文字体网页开发指南
- 下一篇: Android深度探索读后感第二章