Android啟動模式—你需要知道的一切

啟動界面如下:MainActivity—>Activity1—>Activity2—>Activity3—>MainActivity—>MainActivity.

通過android:launchMode設(shè)置啟動模式


默認模式standard

Android系統(tǒng)默認的啟動模式就是standard,當啟動模式為standard時,Log如下

可以看到當Acitivity3啟動位于棧底的MainAcitivity時,是重新創(chuàng)建了一個實例,也就是說,無論棧底是否有MainAcitivity的實例,都會重新創(chuàng)建一個新的實例。

棧頂復用模式singleTop

由于singleTop的啟動模式是棧頂復用,啟動順序不變,Log如下

前面的啟動沒有什么變化,但注意最后從MainActivity—>MainActivity這一步,由于MainActivity在棧頂,所以并沒有重新創(chuàng)建一個MainActivity,而是調(diào)用了一遍MainActivity的onPause和onResume。

這時候可以腦洞大開,當想要避免重復打開一個Activity的時候,就可以設(shè)置此模式,比如在通知欄點擊跳轉(zhuǎn)到Activity的時候。

棧內(nèi)復用模式singleTask

當啟動模式為singleTask時,如果棧內(nèi)已經(jīng)有該Activity的實例的情況下去啟動該Activity,不僅會復用該Activity并把它置于棧頂,而且會把該Activity之上的所有實例全部清空。Log如下:

從Activity3到MainActivity開始看起,因為MainActivity本身位于棧底部,所以以此模式啟動Mainctivity時,不僅復用MainActivity并把它置于棧頂,而且將位于MainActivity之上的實例全部清除,所以此時如果退出MainActivity,就會直接退出應(yīng)用。

如果有兩個不同的任務(wù)棧,其中一個去啟動另一個會怎樣呢,如下圖所示:

這時候如果以singleTask的方式從前臺任務(wù)棧T4中的B去啟動后臺任務(wù)棧T4中的D,這時候后D會位于棧頂,由于D上面已經(jīng)沒有實例,所以從上到下會變成D—>C—>B—>A。而如果去啟動的是C,那么不僅會把C置于棧頂,而且還會清除C之上的實例D,就變成了C—>B—>A。

腦洞大開,因為退出一個應(yīng)用的主頁就意味著退出這個應(yīng)用的所有就面,所以主頁可以使用singleTask的方式啟動,這樣退出主頁,位于主頁之上的所有Activity實例就都銷毀了。

單一實例模式singleInstance

單一實例模式與棧內(nèi)復用模式有相似之處,都會復用之前棧內(nèi)存在的實例,但是不同的是,singleInstance無論什么時候,都只會保證一個實例。并且singleInstance不會把棧頂之上的實例清除掉。Log如下:

可以看到Activity3—>MainActivity的時候,由于之前存在MainActivity的實例,所以直接復用,這時候MainActivity直接位于棧頂。棧內(nèi)的順序從MainActivity—>Activity1—>Activity2—>Activity3變?yōu)锳ctivity1—>Activity2—>Activity3—>MainActivity??梢钥吹讲]有清除MainAcitivity之上的實例。


通過Intent的Flag設(shè)置啟動模式


當flag為Intent.FLAG_ACTIVITY_NO_HISTORY

這時候如果從Activity1—>Activity2,在啟動Activity2的同時,會清除掉Activity1的實例,但是從實際測試中有一種情況除外,單就是從MainActivity啟動Activity1的時候,并沒有清除掉Mainctivity,其他都會清除啟動Activity實例。Log如下:

當flag為Intent.FLAG_ACTIVITY_NEW_TASK

這種啟動模式與之前提到的standard很相似,不再介紹,Log如下:

當flag為Intent.FLAG_ACTIVITY_SINGLE_TOP

這種模式在實際測試中與singleTop并不相同,當把MainActivity設(shè)置為singleTop,此時以上述Flag來啟動Activity1,2,3,在從Activity3啟動Mainctivity,并沒有復用MainActivity,而是重新創(chuàng)建了一個MainActivity的實例,而從MainActivity啟動自身,才復用了MainActivity的實例,Log如下:

當flag為Intent.FLAG_ACTIVITY_CLEAR_TOP

這種flag與singleTop相似,但是也有不同之處,當Activity3啟動MainActivity時,不是重新復用,而是把MainActivity銷毀后重新創(chuàng)建了一個MainActivity實例,Log如下:

當flag為Intent.FLAG_ACTIVITY_CLEAR_TASK

實際測試中與standard相似,每次都會重新創(chuàng)建一個實例,Log如下:


本文參閱:

http://www.itdecent.cn/p/2a9fcf3c11e4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容