admin管理员组文章数量:1567808
- 异常情况下Activity数据的保存和恢复
- 如何保存和恢复数据
- 如何防止Activity重建
异常情况下Activity数据的保存和恢复
如何保存和恢复数据
正常情况下Activity的生命周期比较简单,不再赘述,但是在某些情况下,例如横竖屏的切换,我们知道Activity会被销毁重建,这个时候用户可能已经填写了一些信息,当横竖屏切换时,如果不进行处理,填写的信息就会消失,这种情况下我们需要怎么处理呢?
首先从这种情况下Activity的生命周期说起,当横竖屏切换时,Activity会被销毁,onPause,onStop,onDestory均会被调用,但是由于Activity是异常情况下终止的,所以系统会调用onSaveInstanceState方法对Activity的状态进行保存,该方法在onStop之前调用,与onPause没有既定的时序关系。当Activity被重新创建后,系统会调用onRestoreInstanceState,将之前onSaveInstanceState保存的数据Bundle传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法判读Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并进行恢复,onRestoreInstanceState的调用时机在onStart之后。需要注意的是:在正常情况下Activity的创建和销毁不会调用onSaveInstanceState和onRestoreInstanceState方法。
接下来我们看下使用方法:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("editText",myEdit.getText().toString());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
String str = savedInstanceState.getString("editText");
myEdit.setText(str);
}
我们只需要在onSaveInstanceState中保存需要存储的参数,然后再onRestoreInstanceState获取保存的数据并进行设置即可。
我们平时在重写onCreate方法时,会发现会有一个Bundle参数,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
这个参数其实和onRestoreInstanceState中的Bundle参数是一样的,不过需要我们自己进行判断,而onRestoreInstanceState如果Bundle为Null时则不会调用。因此我们也可以对onCreate方法的Bundle参数进行判断,当Bundle不为null时对数据进行恢复。
如何防止Activity重建
不仅仅当屏幕方向切换时会重建Activity,当系统配置发生改变的时候Activity都会被重建,例如用户插入外接键盘,运营商改变,界面模式(例如开启夜间模式)等都会导致Activity重建。如果我们不希望当系统配置发生变化界面重建,那么我们需要在AndroidManifest.xml中对Activity的configChange属性进行配置。例如我们不希望屏幕旋转时重建,则需要如下设置:
android:configChanges="orientation"
当有多个属性时,用|进行分隔。
虽然configChanges可以配置的选项有很多,但是我们使用比较多的有:
orientation:屏幕方向发生了改变,例如横竖屏切换;
locale:设备的本地位置发生了改变,例如切换了系统语言;
keyboard:键盘类型发生了改变,例如插入了外接键盘;
keyboardHidden:键盘的可访问性发生了改变,例如移除了外接键盘;
注意:如果当我们的minSdkVersion和targetSdkVersion有一个大于13时,为了防止旋转屏幕时Activity重启,我们还需要加上screenSize。
版权声明:本文标题:异常情况下Activity数据的保存和恢复 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726035558a1052887.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论