您的位置:首页 > 其它

异常情况下Activity数据的保存和恢复

2016-03-08 19:18 344 查看
异常情况下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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: