Activity狀態的儲存與恢復
目錄:
- Activity狀態儲存與恢復簡介
- 怎麼實現狀態恢復
- onSaveInstanceState(Bundle), onRestoreInstanceState(Bundle)回撥時機說明
- Bundle使用的注意事項
需求介紹
公司專案的某個業務,需要在整個業務操作流程中儲存一些資料,我們採用了單例模式來儲存這些資料,然後在 整個業務流程中隨時取用。正常操作的情況下是沒有問題的,但是在bugly異常上報中,出現了很多在後臺拉起App 時,出現空指標Crash的問題。經檢查,發現是App被異常殺死後,重新建立App時單例物件中的資料為空導致的。
什麼是Activity的狀態儲存與恢復?
Activity中可能存在這樣兩種資料(包含狀態):
- 生命週期超出當前Activity的生命週期,但是又不需要長期的持久化,只需要在某個業務流程完成前維持其資料。
- 資料在當前Activity生命週期內會發生變化,但是又沒有被系統自動儲存
以上兩種型別的資料有個共同的特點,即並不需要超長時間的持久化儲存,並且只有在非正常操作時才需要儲存,然後在App被後臺異常殺死後重建Activity時,才需要重新拿到並使用。
怎麼實現狀態儲存和恢復?
Activity提供了相應的儲存狀態和恢復狀態的回撥方法。
- 儲存狀態:
- onSaveInstanceState(Bundle)
- onSaveInstanceState(Bundle,PersistableBundle)
- 恢復狀態:
- onCreate(Bundle)
- onRestoreInstanceState(Bundle)
- onRestoreInstanceState(Bundle,PersistableBundle)
以上的方法均是Activity生命週期回撥方法,在異常行為發生時,Activity自動回撥相應方法。
- 方法使用極簡介紹
onSaveInstanceState(Bundle)
把資料往bundle中放,bundle的使用類似Map,以鍵值對的形式儲存資料。onCreate(Bundle)
或onRestoreInstanceState(Bundle)
從bundle把資料取出來,然後恢復資料。
- 方法回撥的時機說明
-
onSaveInstanceState(Bundle)
- 該方法在
onPause()
之後,onStop()
之前被觸發 - Activity呼叫
finish()
方法關閉Activity時不回撥該方法 - 當前Activity(A)開啟另一個Activity(B)時觸發回撥。執行順序為
A.onPause()
->B.onCreate()
->B.onStart()
->B.onResume()
->A.onSaveInstanceState()
->A.onStop
。這裡其實相當於給每一個Activity提供了一個在程式退到後臺時儲存狀態的時機。但實際又是提前儲存的狀態。 - 鎖屏或者Home鍵退出App時觸發回撥。執行順序為
onPause()
->onSaveInstanceState()
->onStop()
- 手機配置發生改變時,比如旋屏。
- 該方法在
-
onCreate(Bundle)
或onRestoreInstanceState(Bundle)
- 重建Activity時觸發,注意是“重建”
- 重建對應的操作:
- App程式被系統異常殺死
- 手機配置改變,旋屏等
- 應用退到後臺,在“最近使用”列表中殺死App並會觸發重建
- Bundle使用注意事項
- 存入Bundle的資料實際是包存在系統程式對應的記憶體中,所以不適合用來儲存大量的資料。
文章專案連結
- 專案github連結: github.com/kishimotoin…
- 專案自薦,一個為Android系統原始碼進行註釋的專案,算是對原始碼的一種學習:github.com/kishimotoin…