浅析onRestoreInstanceState调用时机

2018-12-12  本文已影响83人  FynnJason
@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.e("MainActivity", "onRestoreInstanceState: ");
    }

onRestoreInstanceState只有在activity被系统回收,重新创建activity的情况下才会被调用。

调用的例子

比如上期文章提到的onSaveInstanceState的第5种情况横竖屏切换:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在这里onRestoreInstanceState被调用,是因为屏幕切换时原来的activity被系统回收了,又重新创建了一个新的activity。

不会被调用的例子

而按HOME键返回桌面,又马上点击应用图标回到原来页面时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因为activity没有被系统回收,因此onRestoreInstanceState没有被调用。

如果onRestoreInstanceState被调用了,则页面必然被回收过,则onSaveInstanceState必然被调用过。

解答疑问

这里有人就要问,onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别?

因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。

而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。

而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。

上一篇下一篇

猜你喜欢

热点阅读