你肯定手写过许多 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