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…