公司项目的某个业务,需要在整个业务操作流程中保存一些数据,我们采用了单例模式来保存这些数据,然后在 整个业务流程中随时取用。正常操作的情况下是没有问题的,但是在bugly异常上报中,出现了很多在后台拉起App 时,出现空指针Crash的问题。经检查,发现是App被异常杀死后,重新创建App时单例对象中的数据为空导致的。
Activity中可能存在这样两种数据(包含状态):
以上两种类型的数据有个共同的特点,即并不需要超长时间的持久化保存,并且只有在非正常操作时才需要保存,然后在App被后台异常杀死后重建Activity时,才需要重新拿到并使用。
Activity提供了相应的保存状态和恢复状态的回调方法。
以上的方法均是Activity生命周期回调方法,在异常行为发生时,Activity自动回调相应方法。
把数据往bundle中放,bundle的使用类似Map,以键值对的形式保存数据。
- onSaveInstanceState(Bundle)
或
- onCreate(Bundle)
从bundle把数据取出来,然后恢复数据。
- onRestoreInstanceState(Bundle)
- onSaveInstanceState(Bundle)
之后,
- onPause()
之前被触发
- onStop()
方法关闭Activity时不回调该方法
- finish()
->
- A.onPause()
->
- B.onCreate()
->
- B.onStart()
->
- B.onResume()
->
- A.onSaveInstanceState()
。这里其实相当于给每一个Activity提供了一个在程序退到后台时保存状态的时机。但实际又是提前保存的状态。
- A.onStop
->
- onPause()
->
- onSaveInstanceState()
- onStop()
或
- onCreate(Bundle)
- onRestoreInstanceState(Bundle)
来源: https://juejin.im/post/5a2e4c825188257df846206c