Activity数据保存与恢复浅析

2,943 阅读3分钟

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的数据实际是包存在系统进程对应的内存中,所以不适合用来保存大量的数据。

文章项目链接