Activity資料儲存與恢復淺析

無尾熊二發表於2017-12-12

Activity狀態的儲存與恢復

目錄:

  1. Activity狀態儲存與恢復簡介
  2. 怎麼實現狀態恢復
  3. onSaveInstanceState(Bundle), onRestoreInstanceState(Bundle)回撥時機說明
  4. Bundle使用的注意事項

需求介紹

公司專案的某個業務,需要在整個業務操作流程中儲存一些資料,我們採用了單例模式來儲存這些資料,然後在 整個業務流程中隨時取用。正常操作的情況下是沒有問題的,但是在bugly異常上報中,出現了很多在後臺拉起App 時,出現空指標Crash的問題。經檢查,發現是App被異常殺死後,重新建立App時單例物件中的資料為空導致的。

什麼是Activity的狀態儲存與恢復?

Activity中可能存在這樣兩種資料(包含狀態):

  1. 生命週期超出當前Activity的生命週期,但是又不需要長期的持久化,只需要在某個業務流程完成前維持其資料。
  2. 資料在當前Activity生命週期內會發生變化,但是又沒有被系統自動儲存

以上兩種型別的資料有個共同的特點,即並不需要超長時間的持久化儲存,並且只有在非正常操作時才需要儲存,然後在App被後臺異常殺死後重建Activity時,才需要重新拿到並使用。

怎麼實現狀態儲存和恢復?

Activity提供了相應的儲存狀態和恢復狀態的回撥方法。

  1. 儲存狀態:
  • onSaveInstanceState(Bundle)
  • onSaveInstanceState(Bundle,PersistableBundle)
  1. 恢復狀態:
  • onCreate(Bundle)
  • onRestoreInstanceState(Bundle)
  • onRestoreInstanceState(Bundle,PersistableBundle)

以上的方法均是Activity生命週期回撥方法,在異常行為發生時,Activity自動回撥相應方法。

  1. 方法使用極簡介紹
  • onSaveInstanceState(Bundle) 把資料往bundle中放,bundle的使用類似Map,以鍵值對的形式儲存資料。
  • onCreate(Bundle)onRestoreInstanceState(Bundle) 從bundle把資料取出來,然後恢復資料。
  1. 方法回撥的時機說明
  • onSaveInstanceState(Bundle)

    1. 該方法在onPause()之後,onStop()之前被觸發
    2. Activity呼叫finish()方法關閉Activity時不回撥該方法
    3. 當前Activity(A)開啟另一個Activity(B)時觸發回撥。執行順序為A.onPause()->B.onCreate()->B.onStart()->B.onResume()->A.onSaveInstanceState()->A.onStop。這裡其實相當於給每一個Activity提供了一個在程式退到後臺時儲存狀態的時機。但實際又是提前儲存的狀態。
    4. 鎖屏或者Home鍵退出App時觸發回撥。執行順序為onPause()->onSaveInstanceState()->onStop()
    5. 手機配置發生改變時,比如旋屏。
  • onCreate(Bundle)onRestoreInstanceState(Bundle)

    1. 重建Activity時觸發,注意是“重建”
    2. 重建對應的操作:
      • App程式被系統異常殺死
      • 手機配置改變,旋屏等
    3. 應用退到後臺,在“最近使用”列表中殺死App並會觸發重建
  1. Bundle使用注意事項
  • 存入Bundle的資料實際是包存在系統程式對應的記憶體中,所以不適合用來儲存大量的資料。

文章專案連結

相關文章