1. 程式人生 > >android Activity生命週期總結

android Activity生命週期總結

是什麼?

acntivity是一組包含使用者介面的元件,主要用於和使用者進行互動的。也就是使用者看得到的東西就是activity

Activity是怎麼回退的:

android是使用任務task去管理activity的,

Android中的activity是層疊顯示的,每啟動一個activity,新的activity就會覆蓋在舊的上面,如果按下返回按鈕,就會銷燬最上層的,這是在這層下面的就會顯示出來。。

Activity的4種狀態:

執行狀態:

這時activity在棧頂,對使用者是可見的,系統無論如何,也不會去回收一個正在執行的activity。

暫停狀態:

Ativity不在棧頂了,仍然可見的時候,這個時候處於暫停狀態,比如彈出一個dialog

的時候,這個時候棧頂的activity就是暫停狀態,但是對使用者還是可見的,系統會在記憶體極低的時候,回收掉這個activity。

停止狀態:

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:單一例項模式

他會執行在自己單獨,獨立的任務棧裡面,