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

文章项目连接

相关文章
相关标签/搜索