在做Android生命週期實驗過程中,把 Log.i(TAG, "(1) onCreate()")
寫到了含有兩個參數的函數 onSaveInstanceState(Bundle, PersistableBundle)
中,運行過程中並沒有輸出預想的內容。
查看函數定義,這個函數是通過調用 onSaveInstanceState(Bundle)
實現的。
那麼這兩個函數有什麼區別呢?
看上面圖上圈起來的"but"
,發現onSaveInstanceState(Bundle, PersistableBundle)
只能被有“persistAcrossReboots”
屬性的activity調用。要用這個函數,需要在配置文件中爲Activity設置一個屬性:
android:persistableMode="persistAcrossReboots"
此後就可以使用含有兩個參數的onCreate、onSaveInstanceState、onRestoreInstance函數了。具體參見: bug修復-android中的onCreate兩個參數的方法是什麼鬼?
兩種函數使用場景的區別: 原文鏈接
- onCreate(Bundle):當Activity非正常銷燬之後,例如手機旋轉,內存不足導致的後臺自動銷燬。
- onCreate(Bundle, PersistableBundle):手機由於過熱,沒電或者第三方定製Rom由於卡頓而異常關機的情況,能找回之前前臺的數據,實際上是一種數據持久化的Activity。
onSaveInstanceState函數執行條件:
- 點擊home鍵回到主頁
- 點擊任務鍵選擇運行其他程序
- 從activity中啓動一個新的activity時
- 按下電源鍵關閉屏幕(執行onRestoreInstance)
- 橫豎屏切換(執行onRestoreInstance)
onRestoreInstance函數執行條件:
activity是被系統回收,重新創建activity的情況下調用onRestoreInstance()。如:按下電源鍵關閉屏幕、橫豎屏切換。
函數執行順序:
- onCreate()初始化Activity —> onStart()生成可視化界面 —> onResume()進入活動狀態。
- 旋轉屏幕後,onPause()進入暫停狀態 —> onStop()對用戶不可見 —> onSaveInstanceState()保存狀態信息 —> (橫豎屏切換的時候會由系統先銷燬activity,然後再重新創建)onStop()對用戶不可見 —> onDestory()銷燬活動,釋放資源
- 再次新建一個activity,由於activity是被系統回收,所以重新創建activity的情況下會調用onRestoreInstance():onCreate()初始化Activity —> onStart()生成可視化界面—> onRestoreInstance()恢復onSaveInstanceState()保存的用戶界面信息—> onResume()恢復被onPause()停止的用於界面更新的資源。
Activity事件回調函數的調用順序: