Activity數據保存與恢復淺析

Activity狀態的保存與恢復

目錄:

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

需求介紹

公司項目的某個業務,須要在整個業務操做流程中保存一些數據,咱們採用了單例模式來保存這些數據,而後在 整個業務流程中隨時取用。正常操做的狀況下是沒有問題的,可是在bugly異常上報中,出現了不少在後臺拉起App 時,出現空指針Crash的問題。經檢查,發現是App被異常殺死後,從新建立App時單例對象中的數據爲空致使的。git

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

Activity中可能存在這樣兩種數據(包含狀態):github

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

以上兩種類型的數據有個共同的特色,即並不須要超長時間的持久化保存,而且只有在非正常操做時才須要保存,而後在App被後臺異常殺死後重建Activity時,才須要從新拿到並使用。學習

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

Activity提供了相應的保存狀態和恢復狀態的回調方法。指針

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

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

  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的數據實際是包存在系統進程對應的內存中,因此不適合用來保存大量的數據。

文章項目連接

相關文章
相關標籤/搜索