onSaveInstanceState 和onRestoreInstanceState

314 阅读3分钟

juejin.cn/post/684490…

blog.csdn.net/u010126792/…

你肯定手写过许多 onSaveInstanceState 以及 onRestoreInstanceState 方法用来保持 Activity 的状态,因为 Activity 在变为不可见以后,系统随时可能把它回收用来释放内存。重写 Activity 中的 onSaveInstanceState 方法 是 Google 推荐的用来保持 Activity 状态的做法。

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

横竖屏切换,onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在这里onRestoreInstanceState被调用,是因为屏幕切换时原来的activity被系统回收了,又重新创建了一个新的activity。

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

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

1、onSaveInstanceState

onSaveInstanceState方法在Activity可能被销毁之前执行,保存状态信息,异常销毁后可以利用这些信息进行恢复。被调用在把界面放入后台或者可能被销毁之前(onPause和onStop之间调用)。如果确定Activity会被销毁,比如用户按下了返回键,或者调用了finish()方法销毁activity,则onSaveInstanceState不会被调用。 

onSaveInstanceState(Bundle outState)会在以下情况被调用(进入后台,可能被销毁(不是确定会被销毁)): 

1、当用户按下HOME键时,屏幕被关闭时。 

2、从当前activity启动一个新的activity时。 

3、屏幕方向切换时。 

2、onRestoreInstanceState 

onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用,此时参数savedInstanceState一定不为null,在onStart方法之后执行,如果在onRestoreInstanceState中读取savedInstanceState一定有值,如果在onCreate中读取Bundle存储的信息是有可能为null的 

3 、onCreate方法里Bundle参数,可以用来恢复数据和onRestoreInstanceState的区别。 onRestoreInstanceState上的注释写的很明白,是可以利用onCreate方法恢复Activity的,所以onCreate中的参数就是执行savedInstanceState后存储的数据。但onCreate方法在savedInstanceState之前执行,savedInstanceState又可能不被执行,所以利用onCreate恢复时需要进行判null处理,但是如果调用了onRestoreInstanceState,参数Bundle一定不为null,可以直接使用参数。 

4 、savedInstanceState在几种情况下的和生命周期执行的例子

1、当用户按下HOME键时,屏幕被关闭时。 

2、从当前activity启动一个新的activity时。

 3、屏幕方向切换时。 

 首先打开新的activity没有执行savedInstanceState。 

按下home键:

onPause 

onSaveInstanceState

onStop

按下home键后再回来

没有调用savedInstanceState。 

关闭屏幕: 

onPause 

onSaveInstanceState

 onStop 

 关闭屏幕之后回来没有调用。 

从当前Aty,打开新的Activity: 

onPause 

onSaveInstanceState

 onStop 

屏幕方向切换,

没有在AndroidManifest.xml中设置configChanges,

如果设置了参数由于一定不会被销毁,

所以不会调用:

 onPause

 onSaveInstanceState

 onStop 

onDestroy 

onCreate

 onStart 

onRestoreInstanceState

 onResume