onSaveInstanceState和onRestoreInstanceState方法的调用

只有当Activity在异常状态下被结束时,系统才会调用onSaveInstance方法,用于保存当前Activity的状态,以便后续在重建被异常结束的Activity时调用onRestoreInstatnceState方法来恢复现场。

onSaveInstance方法只在Activity异常结束的时候调用,而且是在onStop之前。onSaveInstance方法会把数据保存在Bundle对象中,当被异常结束的Activity被重建以后,系统会调用onRestoreInstanceState方法,并把这个Bundle对象同时传递给onRestoreInstanceState和onCreate方法。因此onRestoreInstanceState方法可以用于恢复Activity的状态。onRestoreInstanceState方法的调用时机是在onStart之后。

那么,具体来说onSaveInstance方法会在什么时候被调用呢?

上面我也提到onSaveInstance方法是在onstop之前执行,也就是用户切换到桌面或者别的应用的时候就会被调用。onSaveInstance方法只在Activity被异常结束的时候调用,其实就是说当你的应用有可能被异常结束的时候,这个方法就会被调用。

下面这些都是应用有可能被异常结束的情况,这种时候系统就会调用onSaveInstance:

1、用户按home键切换到桌面

2、切换到别的应用

3、按下电源按钮/息屏

4、横竖屏切换

横竖屏切换的生命周期:onPause()->onSaveInstanceState()->onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState->onResume()

可以看出来横竖屏切换的时候经历了Activity的销毁和重建。如果我们不希望横竖屏导致Activity的销毁和重建,我们可以这样做:

在AndroidManifest文件的Activity中指定如下属性:

android:configChanges = "orientation| screenSize"

这样的话当应用进行横竖屏切换的时候,就不会经历Activity的销毁和重建了,而是回调以下方法:

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
}

onRestoreInstatnceState方法用于Activity被异常结束后再次创建的时候调用来恢复现场。但是需要注意的是,onRestoreInstanceState方法不一定是和onSaveInstance方法成对出现的,onSaveInstance方法是在系统判断Activity有可能被异常结束的时候就会被调用,而onRestoreInstance方法则是必须要Activity真的被异常销毁之后并重建的时候才能调用。比如用户先在Activity a中切换到Activity b,然后马上又返回到Activity a,因为从a切换到b的时候,系统判断为有可能会被异常销毁,所以会调用onSaveInstance方法,但是因为Activity没有真正被销毁,所以从Activity b返回到Activity a的时候,Activity a不会调用onRestoreInstance。onRestoreInstance的调用基于Activity真的被异常销毁这个事实上。

另外,因为调用onSaveInstanceState方法保存的Bundle对象会同时传递给onCreate和onRestoreInstanceState方法,所以也可以在onCreate方法中进行恢复数据的操作。onCreate和onRestoreInstanceState方法恢复Activity的区别在于:onRestoreInstanceState回调则表明Bundle对象非空,不用加非空判断,而onCreate中则需要非空判断,因此一般建议使用onRestoreInstanceState方法来进行数据恢复。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值