Acticity中onSaveInstanceState、onCreate、onRestoreInstanceState调用时机

一、onSaveInstanceState和onRestoreInstanceState是Activity在异常情况下的生命周期

非主动销毁,离开当前Activity,该Activity可能被系统回收或销毁的情况下;在页面离开时,onSaveInstanceState会被回调,用于保存数据,用于Activity被销毁而后恢复时恢复数据(在onCreate和onRestoreInstanceState中携带之前onSaveInstanceState中保存的数据);当然有可能离开页面后Activity并没有被回收,此时也不涉及恢复数据。

当Activity执行onStop方法时,通过分析源码知道只要Activity没有执行finish函数一定会调用onSaveInstanceState的方法,然后再去调用onStop方法。主动销毁就是指调用了finish函数的情况

二、onSaveInstanceState会被回调的情形

按下Home键 : Activity 进入了后台, 此时会调用该方法;
按下电源键 : 屏幕关闭, Activity 进入后台;
启动其它 Activity : Activity 被压入了任务栈的栈底;(启动时又调用了finish除外,此时onSaveInstanceState不会被回调)
横竖屏切换 : monifest默认配置下,未单独设置configChanges,会销毁当前 Activity 并重新创建;

三、onSaveInstanceState不会被回调的情形

1.用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;

2.当Activity只执行onPause方法时(Activity a打开一个透明Activity b)这时候如果App设置的targetVersion大于android3.0则不会执行onSaveInstanceState方法。

四、Activity被系统销毁时数据的保存与恢复 :

数据保存 : 回调onSaveInstanceState(Bundle outState)方法时,需要保存的状态数据, 可以以键值对的形式 保存在 Bundle 对象中;
恢复数据 : 在Activity的onCreate(Bundle savedInstanceState)方法和onRestoreInstanceState(Bundle savedInstanceState) 方法,它们参数中的Bundle 对象, 便是保存数据的 Bundle 对象;在两个函数中的一个里面解析和恢复数据即可。

注意:
1.在 Activity 被系统销毁之后,恢复 Activity 时onRestoreInstanceState才会被调用;Activity已经被销毁了,恢复时onCreate自然也会被调用;onCreate会早于onRestoreInstanceState被调用,二者参数savedInstanceState保存的内容是一样的,开发者可以根据需要,参考两个方法回调的时机使用。

2.如果内存充足, 系统没有销毁这个Activity, onRestoreInstanceState不会被调用;Activity未销毁,onCreate自然也不会被调用。

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

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

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

五、具体的生命周期序列

monifest默认配置下,横竖屏切换:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

HOME键回桌面,再回到原来页面:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因为activity没有被系统回收,因此onRestoreInstanceState没有被调用。

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

六、布局中组件状态存储

每个组件都实现了 onSaveInstance()方法, 在调用函数的时候, 会自动保存组件的状态, 注意,只有有id的组件才会保存;默认的super.onSaveInstanceState(outState)便实现了组件状态的保存;

你可能感兴趣的:(Acticity中onSaveInstanceState、onCreate、onRestoreInstanceState调用时机)