? ?作為一個從事Android工作的小菜鳥,來談一談我對四大組件之一的Activity的簡單理解和使用械馆。先上一張生命周期圖卤唉,這樣看起來屌屌的
相信不少朋友也已經(jīng)看過這個流程圖了,也基本了解了Activity生命周期的幾個過程射窒,我們就來說一說這幾個過程藏杖。
1.啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法脉顿,最后調(diào)用onResume蝌麸,Activity進入運行狀態(tài)。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統(tǒng)會調(diào)用onPause方法艾疟,暫停當前Activity的執(zhí)行来吩。
3.當前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏:系統(tǒng)會調(diào)用onResume方法,再次進入運行狀態(tài)蔽莱。
4.當前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏弟疆,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法,然后調(diào)用onStop方法碾褂,進入停滯狀態(tài)兽间。
5.用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法正塌,最后調(diào)用onResume方法嘀略,再次進入運行狀態(tài)。
6.當前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài)乓诽,即第2步和第4步帜羊,系統(tǒng)內(nèi)存不足,殺死當前Activity鸠天,而后用戶退回當前Activity:再次調(diào)用onCreate方法讼育、onStart方法、onResume方法稠集,進入運行狀態(tài)奶段。
7.用戶退出當前Activity:系統(tǒng)先調(diào)用onPause方法,然后調(diào)用onStop方法剥纷,最后調(diào)用onDestory方法痹籍,結(jié)束當前Activity。
除了這7個方法晦鞋,還要在介紹3個方法蹲缠,我個人在覺得還是比較有用的
1、onWindowFocusChanged 在Activity窗口獲得或失去焦點時被調(diào)用悠垛,例如創(chuàng)建時首次呈現(xiàn)在用戶面前线定;當前Activity被其他Activity覆蓋;當前 ? ? ? ? ? Activity轉(zhuǎn)到其他Activity或按Home鍵回到主屏确买,自身退居后臺斤讥;用戶退出當前Activity。以上幾種情況都會調(diào)用湾趾,并且當Activity被創(chuàng)建時是在 ? ? ? ? onResume之后被調(diào)用周偎,當Activity被覆蓋或者退居后臺或者當前Activity退出時抹剩,它是在onPause之后被調(diào)用撑帖,這個方法在某種場合下還是很有 ? ? ? 用的蓉坎,例如程序啟動時想要獲取視特定視圖組件的尺寸大小,在onCreate中可能無法取到胡嘿,因為窗口Window對象還沒創(chuàng)建完成蛉艾,這個時候我 ? ? ? ? 們就需要在onWindowFocusChanged里獲取。
2衷敌、onSaveInstanceState? 在Activity被覆蓋或退居后臺之后勿侯,系統(tǒng)資源不足將其殺死,此方法會被調(diào)用缴罗;在用戶改變屏幕方向時助琐,此方法會被調(diào) ? ? ? ? ? 用;在當前Activity跳轉(zhuǎn)到其他Activity或者按Home鍵回到主屏面氓,自身退居后臺時兵钮,此方法會被調(diào)用。第一種情況我們無法保證什么時候發(fā)生舌界, ? ? ? 系統(tǒng)根據(jù)資源緊張程度去調(diào)度掘譬;第二種是屏幕翻轉(zhuǎn)方向時,系統(tǒng)先銷毀當前的Activity呻拌,然后再重建一個新的葱轩,調(diào)用此方法時,我們可以保存一 ? ? ? 些臨時數(shù)據(jù)藐握;第三種情況系統(tǒng)調(diào)用此方法是為了保存當前窗口各個View組件的狀態(tài)靴拱。onSaveInstanceState的調(diào)用順序是在onPause之前。
3猾普、onRestoreInstanceState? 在Activity被覆蓋或退居后臺之后袜炕,系統(tǒng)資源不足將其殺死,然后用戶又回到了此Activity抬闷,此方法會被調(diào)用妇蛀;在用戶 ? ? ? ? 改變屏幕方向時,重建的過程中笤成,此方法會被調(diào)用评架。我們可以重寫此方法,以便可以恢復一些臨時數(shù)據(jù)炕泳。onRestoreInstanceState的調(diào)用順序 ? ? ? ?是在onStart之后纵诞。
接下來就看Activity的四大啟動模式standard、singleTop培遵、singleTask浙芙、singleInstance
在配置文件中的配置方法是 android:launchMode="你需要的啟動模式"登刺。
1、standard(默認啟動模式)
? ? ? 這個模式是默認的啟動模式嗡呼,即標準模式纸俭,在不指定啟動模式的前提下,系統(tǒng)默認使用該模式啟動Activity南窗,每次啟動一個Activity都會重寫創(chuàng) ? ? ? ? 建一個新的實例揍很,不管這個實例存不存在,這種模式下万伤,誰啟動了該模式的Activity窒悔,該Activity就屬于啟動它的Activity的任務(wù)棧中。這個 ? ? ? ? ? ? ? ?Activity它的onCreate()敌买,onStart()简珠,onResume()方法都會被調(diào)用。
2虹钮、singleTop(棧頂模式)
? ? 這種模式首先會判斷要激活的Activity是否在棧頂聋庵,如果在則不重新創(chuàng)建新的實例,復用當前的實例芜抒,如果不在棧頂珍策,則在任務(wù)棧中創(chuàng)建實例。 ? ? ? 條件是是否在棧頂宅倒,而不是是否在棧中攘宙。注意,如果要激活的Activity在棧頂則直接調(diào)用拐迁,onCreate()蹭劈,onStart()方法不會被調(diào)用,因為它并沒 ? ? ? 有發(fā)生改變线召,如果不在棧頂則會重新創(chuàng)建Acgtivity并且onCreate()铺韧,onStart()方法會執(zhí)行。
注意:standard和singleTop啟動模式都是在原任務(wù)棧中新建Activity實例缓淹。
3哈打、singleTask(棧內(nèi)復用)
? ? ?這種模式啟 動的目標Activity實例如果已經(jīng)存在task容器棧中,不管當前實例處于棧的任何位置讯壶,是棧頂也好空猜,棧底也好提前,還是處于棧中間眷细,只 ? ? ?要目標 Activity實例處于task容器棧中膛虫,都可以重用該Activity實例對象,然后,把處于該Activity實例對象上面全部Activity實 例清除掉氛改,并且帐萎, ? ? ?task容器棧中永遠只有唯一實例對象,不會存在兩個相同的實例對象胜卤。所以疆导,如果你想你的應(yīng)用不管怎么啟動目標Activity,都只有 唯一一個實 ? ? ?例對象瑰艘,就使用這種啟動模式是鬼。
4、singleInstance(單獨一棧)
? ? 該模式具備singleTask模式的所有特性外紫新,與它的區(qū)別就是,這種模式下的Activity會單獨占用一個Task棧李剖,具有全局唯一性芒率,即整個系統(tǒng)中就這么一個實例,由于棧內(nèi)復用的特性篙顺,后續(xù)的請求均不會創(chuàng)建新的Activity實例偶芍,除非這個特殊的任務(wù)棧被銷毀了。以singleInstance模式啟動的Activity在整個系統(tǒng)中是單例的德玫,如果在啟動這樣的Activiyt時匪蟀,已經(jīng)存在了一個實例,那么會把它所在的任務(wù)調(diào)度到前臺宰僧,重用這個實例材彪。