1. 程式人生 > >activity生命週期 詳解

activity生命週期 詳解

activity生命週期詳解

1.首先回顧一下Activity的生命週期,具體流程見下圖:


Activity的七個生命週期: onCreate是必須實現一個方法,建立Activity時執行,在該方法中通過setContentView()來指定activity中要顯示的xml佈局資原始檔;在該方法中完成初始化變數,元件,開啟執行緒下載等操作 onRestart:activity從onStop狀態再次被啟動時執行 onStart: 當activity建立完成執行,activity進入可視狀態 onResume:準備就緒,activity顯示在螢幕最上方,可以和使用者進行互動(接受使用者輸入,獲取手勢等
) onPause:準備從當前activity啟動一個新的activity,先暫停當前activity再啟動新的activity onStop:當新啟動的activity準備就緒(onResume),舊的activity由onPause進入onStop狀態 onDestroy:activity銷燬時呼叫該方法,是activity最終的生命週期方法,執行該方法後,銷燬當前activity以及其所有成員變數


Activity一共有七個生命週期方法:

從啟動頁面1,再啟動頁面2,燃火返回頁面1,頁面2的生命週期方法用橙色表示

1)一個Activity頁面啟動 執行 oncreate()--> onStart() -->  onResume()

2)開啟第二個頁面時 第一個頁面先onPause()  ---> 第二個頁面 oncreate()--> onStart() -->  onResume() 

3)當第二個頁面執行到onResume()時,第一個頁面不在可見 執行onStop()

4)當從頁面2返回頁面1時,頁面2 先onPause()返回頁面1時,由於已經停止(但未銷燬),頁面1 執行onRestar()-->onStart()-->onResume

5)當第二個頁面執行到onResume()時,第二個頁面不在可見 執行onStop()-->onDestory()停止並銷燬

觀察列印結果:


2.頁面橫豎屏切換時Activity的生命週期

Activity的生命週期正常情況下,是按以上流程的,但是當頁面橫豎屏切換生命週期又是另外一種情況:

橫豎屏切換時,當前頁面先暫停 onPause(),然後重新載入頁面 oncreate()--> onStart() -->  onResume()

為了防止螢幕轉動而重新載入Acitivy,可以禁止螢幕轉動

<activity
            android:name="com.example.savestateactivity.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="landscape" >

android:screenOrientation屬性,他有以下幾個引數:

"unspecified":預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向.

"landscape":橫屏顯示(寬比高要長)

"portrait":豎屏顯示(高比寬要長)

"user":使用者當前首選的方向

"behind":和該Activity下面的那個Activity的方向一致(在Activity堆疊中的)

"sensor":有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。

"nosensor":忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了("unspecified"設定除外)。


引用:
android:configChanges="orientation|keyboard|keyboardHidden"  通過查閱Android API可以得知android:onConfigurationChanged實際對應的是Activity裡的onConfigurationChanged()方法。在AndroidManifest.xml中新增上訴程式碼的含義是表示在改變螢幕方向、彈出軟體盤和隱藏軟鍵盤時,不再去執行onCreate()方法,而是直接執行onConfigurationChanged()。如果不申明此段程式碼,按照Activity的生命週期,都會去執行一次onCreate()方法,而onCreate()方法通常會在顯示之前做一些初始化工作。所以如果改變螢幕方向這樣的操作都去執行onCreate()方法,就有可能造成重複的初始化,降低程式效率是必然的了,而且更有可能因為重複的初始化而導致資料的丟失。這是需要千萬避免的。

3、Activity狀態儲存,persistend 持久化 Activity 執行生命週期onPause或onStop方法,該activity雖然不可見,可是該activity的物件依然存在記憶體中,所以該activity的成員變數和狀態仍然是存在的。 然而,當系統記憶體緊張時,系統會自動回收不可見activity,被回收的activity會執行onDestroy進行銷燬。當我們此時按下回退鍵返回被銷燬activity時,會通過onCreate再次重建頁面(這時我們是不容易發現該activity曾經被銷燬過),但是被銷燬activity成員變數值的內容由於再次onCreate而恢復初始化狀態,針對這種情況,為了確保返回依然activity仍然儲存之前的頁面資訊狀態,需要重寫activity的回撥方法onSaveInstanceState().來進行狀態儲存

總結:定義生命週期的優點: ①當用戶接一個電話或切換到另一個程式不會崩潰 ②當用戶後臺執行程式時不會銷燬有價值的系統資源 ③當用戶離開再返回你的應用時不會丟失使用者的程序 ④當手機螢幕進行橫豎屏切換的時候不會崩潰或者丟掉使用者的程序