Android Activity启动模式总结
簡介
Activity 作為 Android 四大組件之一,幾乎是被接觸得最多的。Activity 中有個啟動模式的概念,分別是 standard、singleTop、singleTask 以及 singleinstance,這篇文章總結(jié)一下這四種啟動模式的特點。
任務棧
當我們打開一個 APP,第一個出現(xiàn)的 Activity 是我們指定的默認 Activity,通過這個 Activity 可以跳轉(zhuǎn)到其它 Activity,按返回鍵可以依次返回到上一個 Activity。這是因為系統(tǒng)把我們打開的 Activity 放在一個任務棧中。打開第一個 Activity 時,系統(tǒng)會新建一個任務棧,如果繼續(xù)打開新的 Activity,會創(chuàng)建新 Activity 的實例并且放到任務棧的棧頂,返回時將棧頂?shù)?Activity 出棧,新的棧頂 Activity 將呈現(xiàn)在界面上,過程如下圖。
這是默認情況下的任務的入棧出棧,如果指定了不同的啟動模式將會有不同的表現(xiàn)。
standard
standard 是標準啟動模式,當我們沒有指定 Activity 的啟動模式時,默認就是這種模式。在 standard 模式下,每次啟動一個 Activity 都會創(chuàng)建一個新的實例,它的 onCreate、onStart 以及 onResume均會被調(diào)用。這個新創(chuàng)建的 Activity將會放在啟動它的 Activity 所在的任務棧的棧頂。
- 比如 Activity A 在棧 S ,它啟動了 Activity B(standard 模式),那么 B 將會進入 A 所在的棧 S。
- 如果在沒有任務棧的情況下啟動 standard 模式的 Activity,比如在 Service 中,此時新的 Activity 沒有任務??扇?#xff0c;會出現(xiàn)異常:
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 已經(jīng)在任務棧的棧頂了,那么就不會重新創(chuàng)建新的實例,而是調(diào)用這個 Activity 的 onPause、onNewIntent 以及 onResume 方法。如果新啟動的 Activity 不是位于棧頂,那么還是會重新創(chuàng)建。
- 比如現(xiàn)在棧內(nèi)情況是 ABCD 四個Activity,A 位于棧底,D 位于棧頂。如果 D 的啟動模式為 singleTop,那么不會再次創(chuàng)建 D 的實例,棧內(nèi)依然是 ABCD。
- 如果上面的 D 為 standard 啟動模式,那么棧內(nèi)將變?yōu)?ABCDD。
singleTask
singleTask 是棧內(nèi)復用模式。這是最復雜的一種模式,因為它可能涉及到多個棧。當一個具有 singleTask 模式的 Activity 啟動后,比如 Activity A,系統(tǒng)會首先尋找是否存在所需的任務棧,如果不存在,就重新創(chuàng)建一個任務棧,然后創(chuàng)建 A 的實例后把 A 放入到棧中。如果存在 A 所需要的任務棧,這時要看 A 是否在棧中有實例存在,如果有,那么系統(tǒng)就會把它調(diào)到棧頂并且調(diào)用它的 onNewIntent 方法,如果不存在,就創(chuàng)建 A 的實例并把 A 壓入棧中。這里所說的 A 所需要的任務棧是什么意思呢?其實 Activity 是可以指定自己想要的任務棧的名字的,通過一個參數(shù):TaskAffinity,默認情況下,所有的 Activity 所需要的任務棧的名字為應用的包名。
- 如果任務棧 S1 中的情況為 ABC,這個時候 Activity D 以 singleTask 模式請求啟動,它需要的任務棧為 S2,由于 S2 和 D 的實例均不存在,所以系統(tǒng)就會先創(chuàng)建任務棧 S2,然后在創(chuàng)建 D 的實例并將其入棧到 S2
- 如果上面 D 所需的任務棧為 S1,那么因為 S1 已經(jīng)存在,所以系統(tǒng)直接創(chuàng)建 D 的實例并且入棧到 S1。
- 如果 D 所需的任務棧為 S1,但是 S1 中的情況為 ADBC,此時 D 不會重新創(chuàng)建,而是把 D 切換到棧頂并調(diào)用 onNewIntent 方法。那 B 和 C 怎么辦? 它們會全部出棧,相當于 clearTop 效果。
singleInstance
singleInstance 是單實例模式。這種模式是 singleTask 的加強版,它除了具有 singleTask 的所有特性外,還加強了一點,那就是此種模式的 Activity 只能單獨位于一個任務棧中。
- 比如 Activity A 是 singleInstance 模式,當 A 啟動后,系統(tǒng)會創(chuàng)建一個新的任務棧,然后 A 獨自在這個新的任務棧中,由于棧內(nèi)復用的特性,后續(xù)的請求均不會創(chuàng)建新的 Activity,除非這個棧被銷毀了。
總結(jié)
Activity 的四種啟動模式就是這樣,除了 singleTask 稍微有點復雜,其它都很好理解。有的時候會出現(xiàn)多個任務棧的情況,比如現(xiàn)在有兩個任務棧(如下圖),前臺的任務棧情況為 Activity1 和 Activity2, 而后臺任務棧的情況為 ActivityX 和 ActivityY,假設 XY 的啟動模式均為 singleTAsk?,F(xiàn)在啟動Y, 那么整個后臺任務棧都被切換到前臺,這時候的后退列表變?yōu)?12XY。當按返回鍵的時候,Activity 會依次出棧。
參考
如果我的文章對您有幫助,不妨點個贊鼓勵一下(^_^)
總結(jié)
以上是生活随笔為你收集整理的Android Activity启动模式总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] 中文字体网页开发指南
- 下一篇: vsftpd的基于pam_mysql的虚