android Activity生命週期總結
是什麼?
acntivity是一組包含使用者介面的元件,主要用於和使用者進行互動的。也就是使用者看得到的東西就是activity。
Activity是怎麼回退的:
android是使用任務task去管理activity的,
Android中的activity是層疊顯示的,每啟動一個activity,新的activity就會覆蓋在舊的上面,如果按下返回按鈕,就會銷燬最上層的,這是在這層下面的就會顯示出來。。
Activity的4種狀態:
執行狀態:
這時activity在棧頂,對使用者是可見的,系統無論如何,也不會去回收一個正在執行的activity。
暫停狀態:
Ativity不在棧頂了,仍然可見的時候,這個時候處於暫停狀態,比如彈出一個dialog
停止狀態:
Ativity不在棧頂了,並且完全不可見的時候,就進入了停止狀態,系統會對這類活動進行短暫的保活,並不是完全可靠的,如果其他地方需要記憶體的時候,處於停住狀態就會被回收。
銷燬狀態:
當從返回棧中移除後,就變成了銷燬狀態,系統最喜歡回收這種東西了。
Activity的生命週期。
OnCreate()
第一次建立的時候呼叫。一般用來做一些出資料的操作。比如,載入佈局,初始化事件。。
OnStart()
在不可見準備變為可見的時候呼叫。
OnResume()
可見,並且有焦點互動的時候,這個時候,這個activity一定在返回棧的棧頂。並且處於執行狀態。
OnPause()
系統準備去啟動||恢復另外一個activity的時候呼叫,
OnStop()
在activity完全不可見的時候呼叫,
一般在這裡都會把一些在當前這個activity的耗損資源的一些操作釋放了,和儲存一些關鍵的資料。這個方法一定要快,不能超過10秒,否者系統就會報ARN了。
和上面的區別在,如果開啟新的活動是一個dialog,那麼OnPause會執行,onStop不會執行。
OnDestroy()finish的時候呼叫
銷燬之前呼叫,之後這個activity的狀態就是銷燬狀態了。
OnRestart()
由停止狀態變為執行狀態之前呼叫,就是重啟的時候呼叫,
OnSaveInstanceState()
只有在activity即將銷燬的時候,並且有機會重新顯示的時候才會呼叫,正常生命週期不會呼叫。
生命週期的3種場景劃分
完整生命週期:
從onCreate--->OnDestroy。。一般情況下,onCreate方法中完成初始化操作,onDestroy完成釋放的操作。
可見週期:
OnStart-->OnStop(),這段週期內,對使用者是可見的,並不一定需要和使用者互動,
前臺週期:
OnCreate-->OnResume(),這段週期,是可以和使用者互動的週期,activity經常會在onPause和OnResume中互動很頻發,列如,切換到後臺,切回來,鎖屏,來電話了,被遮擋了,多app切換來回,等等,所以一般建議這兩個方法應當非常簡潔,不應該有耗時操作。。
異常生命週期:
OnPause-->onSaveInstanceState(bundle)--->OnStop->onDestory-->onCreate(bundle)---OnResume()
但是在onStop被呼叫之前系統會呼叫onSaveInstanceState(bundle)儲存資料,這個方法只會在activity異常終止情況下才會呼叫,
,如果出現異常週期,那onCreate的bundle一定不會是空的。
情況1.資源相關的系統配置發生改變導致Activity被殺死並重新建立(如橫豎屏切換)
這種情況,可以通過配置configChanges來解決,
情況2:資源記憶體不足導致低優先順序的Activity被殺死
無法避免,做好資料恢復。
回收場景優先順序:
1.Android不會回收正在處於可見狀態的的activity。
2.記憶體不夠的時候,會回收不可見的Activity。如果被回收了,這個activitu會自動呼叫OnSaveInstanceState,這個辦法,用來儲存資料的,
前臺<---可見但非前臺(dialog)<---後臺(被暫停的Activity)
4種啟動模式:
可以通過設定activity的launchMode來指定啟動模式。
Standard:預設的模式
不值得的情況下,預設就是這種。
每開啟一個新的activity,系統就會建立一個新的活動,插入棧頂,並且顯示,後進先出,不管棧裡有沒有。
SingleTop:棧頂複用模式
如果發現棧頂已經存在,就不會再建立了。
如果不在棧頂,那還是會重複建立。
SingleTask:棧內複用模式
如果棧有,直接使用,不會建立,並且在該棧上面的activity全部出棧,
SingleInstance:單一例項模式
他會執行在自己單獨,獨立的任務棧裡面,