Activity的生命週期

生命週期的分類

典型情況是指在用戶正常操作界面導致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"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章