activity生命週期 詳解
activity生命週期詳解
1.首先回顧一下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().來進行狀態儲存
總結:定義生命週期的優點: ①當用戶接一個電話或切換到另一個程式不會崩潰 ②當用戶後臺執行程式時不會銷燬有價值的系統資源 ③當用戶離開再返回你的應用時不會丟失使用者的程序 ④當手機螢幕進行橫豎屏切換的時候不會崩潰或者丟掉使用者的程序