一、Activity 的生命周期
1.典型情況下 Activity 的生命周期
在正常情況下,Activity 會經(jīng)歷以下生命周期:
onCreate:表示 Activity 正在被創(chuàng)建,可以在這個方法做一些初始化的工作,如
setContentView去加載布局資源、初始化一些參數(shù)。onRestart:表示 Activity 正在重新啟動。一般情況下當 Activity 從不可見變?yōu)榭梢姇r, onRestart 就會被調(diào)用。這種情況一般是用戶按下了 Home 鍵切換到桌面或者用戶打開了一個新的 Activity ,這時當前的 Activity 就會暫停,執(zhí)行 onPause、onStop。緊接著用戶又回到了這個 Activity,這就會調(diào)用這個 Activity 的 onRestart。
onStart:表示 Activity 正在被啟動,這時 Activity 已經(jīng)可見了,但是還沒有出現(xiàn)在前臺,還無法和用戶交互??梢岳斫獬蛇@時 Activity 已經(jīng)顯示出來了,但是用戶看不到。
onResume:這時 Activity 已經(jīng)可見,并出現(xiàn)在前臺可以和用戶交互。注意:onStart 和 onResume 都表示Activity 已經(jīng)可見,但是 onStart 時 Activity 還在后臺,onResume 時 Activity 才顯示在前臺。
onPause:表示 Activity 正在停止,緊接著調(diào)用 onStop 。此時可以做一些輕量級的存儲數(shù)據(jù)、停止動畫等工作,但注意不能太耗時,因為必須要 onPause 執(zhí)行完才能執(zhí)行新的 Activity 的 onCreate、onStart、onResume 。所以重量級的操作盡量在 onStop 中操作。
onStop:表示 Activity 正在停止,可以做一些稍微重量級的回收工作,但是同樣不能太耗時。
onDestroy:表示 Activity 即將被銷毀,可以做一些回收工作和最終資源的釋放,比如移除廣播、反注冊 EventBus。
下面是 Activity 的生命周期切換過程:

2.異常情況下 Activity 的生命周期
-
2.1 資源相關(guān)的系統(tǒng)配置發(fā)生改變導致 Activity 被殺死并重新創(chuàng)建
當系統(tǒng)配置發(fā)生改變,Activity 會被銷毀,其 onPause、onStop、onDestroy 方法會被調(diào)用,同時由于其是異常情況終止的,系統(tǒng)會調(diào)用 onSaveInstanceState 方法來保存當前的狀態(tài)。這個方法是調(diào)用在 onStop 之前,但是和調(diào)用 onPause 沒有確定的先后關(guān)系。onSaveInstanceState 方法只有在異常終止才會被調(diào)用,正常情況不會調(diào)用這個方法。
當 Activity 被重新創(chuàng)建后,系統(tǒng)會調(diào)用 onRestoreInstanceState ,并且把 Activity 銷毀時 onSaveInstanceState 方法保存的 Bundle 對象作為參數(shù)傳給 onRestoreInstanceState 和 onCreate 方法。所以我們能通過 onRestoreInstanceState 和 onCreate 方法判斷Activity 是否被重建了。如果重建了,就取出之前保存的數(shù)據(jù)恢復視圖狀態(tài),onRestoreInstanceState 的調(diào)用時機在 onStart 之后。
-
2.2 資源內(nèi)存不足導致低優(yōu)先級的 Activity 被殺死
當系統(tǒng)內(nèi)存不足時,系統(tǒng)會按照優(yōu)先級高低優(yōu)先殺死優(yōu)先級低的 Activity 所在的進程,并后續(xù)通過 onSaveInstanceState 和 onRestoreInstanceState 來存儲和恢復數(shù)據(jù)。