异常情况下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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值