Android异常退出时Activity数据的保存和恢复

一、onSaveInstanceState & onRestoreInstanceState
(1)使用场景
当我的APP处在前台,能与用户交互的情况下,出现下述的突发事件时,只有点击back键,onSaveInstanceState方法不会调用。但都执行onPause();onSaveInstanceState的调用是处于onPause和onStop之间;能保证的是onSaveInstanceState方法会在onStop之前调用,但是是否在onPause之前就不一定了。onRestoreInstanceState的调用时机在onStart之后。

  • 点击back键
  • 点击锁屏键
  • 点击home键
  • 其他APP进入前台
  • 启动了另一个Activity
  • 屏幕方向旋转
  • APP被Kill
  • 出现crash时

结论:
google工程师们对onSaveInstanceState如此设计就是让其完成对一些临时的、非永久数据存储并进行恢复。什么样的数据属于临时数据呢?举个例子,比如EditText中输入的内容,CheckBox是否勾选,ScrollView的滑动位置,目前视频的播放位置等等。

注意:
(1)正常情况下Activity的创建和销毁不会调用onSaveInstanceState和onRestoreInstanceState方法。
(2)Android的View本身自己就实现了onSaveInstanceState方法,这些控件自己就具有保存临时数据和恢复临时数据的能力。

例如TextView中的部分源码:
在这里插入图片描述
TextView中的实现
其他View控件都有相似的实现原理。值得一提的是,只有当你给这个wiget在xml中指定id时,它才具有保存数据并且恢复的能力,并且不同的wiget还不能共用这个id,否则会出现数据覆盖的情况。具体的源码有兴趣大家可以自己去看,这里因为篇幅的原因不再贴出,关于onSaveInstanceState我们先说这些,赶紧看看使用姿势。

2、使用方式:
OnCreate方法的Bundle类型参数,其实和onRestoreInstanceState中的Bundle参数是一样的,不过需要我们自己进行判断,而onRestoreInstanceState如果Bundle为Null时则不会调用。因此我们也可以对onCreate方法的Bundle参数进行判断,当Bundle不为null时对数据进行恢复。

二、onpause
无论出现怎样的情况,比如程序突然死亡了,能保证的就是onPause方法是一定会调用的,而onStop和onDestory方法并不一定,所以这个特性使得onPause是持久化相关数据的最后的可靠时机。当然onPause方法不能做大量的操作,这会影响下一个Activity入栈。

三、如何防止Activity重建
1、设置Activity的方向固定onCreate方法中设置.但是这种情况不适合手机已经设置为自动旋转的情况。需要在清单文件下设置android:screenOrientation=“portrait”

 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

2、Manifest清单设置
不仅仅当屏幕方向切换时会重建Activity,当系统配置发生改变的时候Activity都会被重建,例如用户插入外接键盘,运营商改变,界面模式(例如开启夜间模式)等都会导致Activity重建。如果我们不希望当系统配置发生变化界面重建,那么我们需要在AndroidManifest.xml中对Activity的configChange属性进行配置。例如我们不希望屏幕旋转时重建,则需要如下设置:
android:screenOrientation=“portrait”
android:configChanges=“orientation”

四、总结:
临时数据使用onSaveInstanceState保存恢复,永久性数据使用onPause方法保存。

https://www.jianshu.com/p/6622434511f7

https://blog.csdn.net/hello_json/article/details/84034638

发布了18 篇原创文章 · 获赞 2 · 访问量 3171

猜你喜欢

转载自blog.csdn.net/shiningdreamercaihua/article/details/103279159
今日推荐