生命週期的分類
典型情況是指在用戶正常操作界面導致Activity生命週期發生改變的情況。
異常情況是指由於內存不足導致低優先級的Activity被系統回收,或者由於當前設備的Configuration發生改變(如旋轉屏幕)而導致Activity銷燬重建的情況。
典型情況下的生命週期
在Activity從創建到消亡的過程中,通常需要先後經歷以下7個生命週期函數。
onCreate:表示Activity正在被創建,在這個方法中,通常會做一些初始化的工作,比如調用setContentView去加載界面佈局資源,綁定事件,初始化Activity所需的數據等。
onRestart:表示Activity正在重新啓動,當Activity從不可見狀態重新變爲可見狀態時被調用。比如用戶切換到其他界面,使當前界面不可見,接着又回到這個Activity的時候。
onStart:表示Activity正在被啓動,此時Activity已經可見,但是還沒有出現在前臺,還處於後臺,無法同用戶交互。
onResume:表示Activity已經可見並且出現在前臺,此時可以和用戶進行交互。
onPause:表示Activity正在停止,此時Activity從前臺轉爲後臺,失去交互能力,但有可能還能被看見(比如當前Activity彈出一個Dialog)。此時可以做一些不太耗時的操作,釋放一些消耗CPU的資源,如存儲關鍵數據、停止動畫。onPause必須先執行完,新Activity的onResume纔會執行。
onStop:表示Activity即將停止,此時Activity變爲不可見狀態。此時可以做一些稍微重量級的回收工作,但不能太耗時。
onDestroy:表示Activity即將被銷燬,在這裏可以做最後的資源回收和釋放。
可以通過以上方法將Activity分爲三種生存期。
完整生存期:活動在onCreate和onDestroy之間稱爲完整生存期。通常情況下在onCreate進行初始化,在onDestroy中完成資源釋放。
可見生存期:活動在onStart和onStop之間稱爲可見生存期。通常情況下在onStart方法中對資源進行加載,在onStop中對資源進行釋放,保證在停止狀態下不會佔用過多的CPU和內存資源。
前臺生存期:活動在onResume和onPause之間稱爲前臺生存期。此時Activity處於運行狀態,可以和用戶進行交互。
生命週期的幾種情況
(1)對一個Activity,第一次啓動回調過程爲:onCreate -> onStart -> onResume。
(2)當用戶打開新的Activity或者按HOME鍵回到桌面或鎖屏時,當前Activity的回調過程爲:onPause -> onStop。
(3)當用戶再次回到Activity時,回調過程爲:onRestart -> onStart -> onResume。
(4)當用戶按BACK鍵回退時,回調過程爲:onPause -> onStop -> onDestroy。
(5)在整個生命週期內,onCreate 和onDestroy只有一次調用,而其他幾個生命週期函數隨着用戶的操作可能多次調用。
(6)假設要從當前ActivityA跳轉到另一個ActivityB,ActivityA的onPause 方法肯定在ActivityB的onResume方法之前執行。
異常情況下的生命週期
情況一:Configuration發生改變
爲了適配不同尺寸的屏幕,Android程序應該提供不同尺寸的資源,比如在平板和手機中橫屏和豎屏的情況下,加載的資源文件就不一樣,當系統的Configuration發生改變,在默認情況下,Activity會被銷燬並重新創建。此時的生命週期如下圖所示。
在Activity銷燬時,除了調用onPause -> Onstop -> OnDestroy外,還會調用Onstop 之前調用onSaveInstanceState來保存當前Activity的狀態(正常的生命週期不會調用這個方法),並將保存的Bundle對象傳入到onRestoreInstanceState(在onStart之後調用)中進行恢復。在Activity異常情況下需要重新創建時,系統會默認保存當前的視圖結構(比如文本框中用戶輸入的數據、ListView滾動位置等),每個View中都有onSaveInstanceState和onRestoreInstanceState方法,每個View會保存和恢復哪些數據可以在這兩個方法中看到。
需要注意的是,onSaveInstanceState和onRestoreInstanceState只會在Activity異常銷燬並且有機會再次顯示的時候才調用,如果沒有機會再次顯示,則不會調用。
Oncreate和onSaveInstanceState參數的區別
onSaveInstanceState一旦被調用,參數一定是有值的,Oncreate被調用,參數可能爲null。
情況二:內存資源不足導致低優先級Activity被殺死
當系統內存不足時,系統會殺死低優先級的Activity所在的進程,並通過onSaveInstanceState和onRestoreInstanceState保存和恢復數據,如果一個進程中沒有四大組件在運行,這個進程將很快被殺死。所以,後臺工作不適合脫離四大組件獨自運行在後臺中,通常需要將後臺工作放在Service中保證進程有一定的優先級。
Activity的優先級從高到低爲:
(1)前臺Activity--正在和用戶交互的Activity,優先級最高。
(2)可見但非前臺Activity--比如彈出一個對話框的Activity。
(3)後臺Activity--已經被暫停的Activity,優先級最低。
不想系統配置改變時Activity重建的措施
android:configChanges="orientation"