[Android問答] 如何理解Activity生命周期?
Android官方文檔里對(duì)Activity的生命周期有比較詳盡的描述,但由于資源回收機(jī)制帶來不確定性,我們的程序運(yùn)行結(jié)果常常與預(yù)期的不符,而調(diào)試這類問題又十分消耗時(shí)間和精力。解決的根本辦法還是要理解透Activity的生命周期及相關(guān)內(nèi)容,這篇帖子著重介紹Activity生命周期本身,之后會(huì)用一兩篇帖子來介紹如何處理異常的狀態(tài)變化。
下圖是官方文檔里的Activity生命周期圖,其中彩色標(biāo)出的四個(gè)框是Activity的四種狀態(tài),當(dāng)Activity的狀態(tài)改變時(shí)會(huì)觸發(fā)一個(gè)或多個(gè)onXXX()方法。

onCreate()
當(dāng)Acitivity第一次被創(chuàng)建時(shí)觸發(fā),一般在這里要做的事情包括創(chuàng)建視圖(setContentView())、向視圖填充必要的數(shù)據(jù)等等。
onRestart()
這個(gè)我比較少用到,按文檔上的介紹,如果Activity之前被stop過,那么下一次onStart()方法之前會(huì)先觸發(fā)這個(gè)方法。
onStart()
只要Activity從不可見變成可見,就會(huì)觸發(fā)到這個(gè)方法,但被AlertDialog遮擋/顯示的情況不算在內(nèi)。
onResume()
當(dāng)Activity來到最上層的時(shí)候,也就是開始與用戶直接交互時(shí),觸發(fā)這個(gè)方法。例如本來Activity被一個(gè)AlertDialog遮擋,當(dāng)這個(gè)AlertDialog消失時(shí),onResume()方法就被觸發(fā)。
onPause()
和onResume()的觸發(fā)條件剛好相反,如果Activity本來在最上層,當(dāng)它要讓出最上層的位置時(shí)會(huì)觸發(fā)這個(gè)方法。onPause()和onResume()是被觸發(fā)最頻繁的兩個(gè)方法,所以在這里不應(yīng)該執(zhí)行過于消耗資源的方法。
onStop()
當(dāng)有其他Activity覆蓋了當(dāng)前Activity時(shí),不論另一個(gè)Activity是新開始的還是從下層移至最上層的,當(dāng)前Activity的onStop()方法都會(huì)被觸發(fā)。
onDestroy()
Activity生命周期的終點(diǎn)。有兩種情況會(huì)導(dǎo)致它被觸發(fā):1)執(zhí)行了Activity#finish()方法;2)Android系統(tǒng)由于資源不足等原因決定殺掉Activity所在進(jìn)程。通過isFinishing()方法可以判斷出是哪種情況。在這個(gè)方法里,我們一般要做的事情是釋放Activity占有的資源,例如后臺(tái)正在進(jìn)行的下載線程等等。
最后,舉個(gè)實(shí)際例子來說明,假設(shè)你有一個(gè)“首頁Activity”和一個(gè)“編輯頁Activity”。
- 當(dāng)用戶點(diǎn)擊首頁里的“開始編輯”按鈕時(shí),首頁的onPause()->onStart()onStop()依次觸發(fā),編輯頁的onCreate()->onStart()->onResume()依次觸發(fā);(感謝James.H.Fu指出的錯(cuò)誤)
- 當(dāng)用戶在編輯頁按下“返回”按鈕時(shí),編輯頁的onPause()->onStop()依次觸發(fā),之后首頁的onStart() -> onResume()依次觸發(fā);
- 這時(shí)用戶在首頁按下“返回”按鈕,首頁的onPause()->onStop()->onDestroy()依次觸發(fā)。
參考資料:
Activity Lifecycle
Simplest Android Activity Lifecycle
Activity lifecycle explained in details

浙公網(wǎng)安備 33010602011771號(hào)