当前位置 博文首页 > 庆述倾述:onSaveInstanceState与onRestoreInstanceState
在 Activity
被销毁之前调用onSaveInstanceState
来保存每个实例的状态,这样就可以保证该状态能够从 onCreate(Bundle)
或者onRestoreInstanceState(Bundle)
恢复过来。
onSaveInstanceState
方法在 Activity
可能被销毁前调用,这样当该 Activity
在将来某个时刻重新回来时可以恢复其之前的状态。
Activity
中的 onSaveInstanceState()
方法和 onRestoreInstanceState()
方法并不是生命周期方法,它们不同于 onCreate()
、onPause()
等生命周期方法,它们并不一定会被触发。
当应用遇到意外情况(如:内存不足、用户直接按Home
键),由系统销毁一个 Activity
时,onSaveInstanceState
() 方法就会被调用。
但是当用户主动去销毁一个 Activity
时,例如在应用中按返回键,onSaveInstanceState()
方法就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity
的状态。通常onSaveInstanceState()
方法只适合用于保存一些临时性的状态,而onPause()
方法适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity
会被销毁并重新创建,如果你想在 Activity
被销毁前缓存一些数据,并且在 Activity
被重新创建后恢复缓存的数据。可以重写 Activity
中的 onSaveInstanceState()
方法和 onRestoreInstanceState()
方法。
在Android Jetpack
中提供了viewModel
来进行状态的保存。
由于 onSaveInstanceState()
方法并不是在每次被销毁时都会调用,所以不要在其中保存那些需要永久化的数据,执行保存那些数据的最好地方是在 onPause()
方法中。
但是 Activity
上控件的样子可能依然能被保存并恢复。原来 Activity 类已实现了onSaveInstanceState()
,在 onSaveInstanceState()
的默认实现中,会调用所有控件的相关方法,把控件们的状态都保存下来,比如 EditText
中输入的文字、CheckBox
是否被选中等等。然而不是所有的控件都能被保存,这取决于你是否在 layout 文件中为控件赋了一个名字(android:id)。有名的就存,无名的不管。
既然有现成的可用,那么我们到底还要不要自己实现 onSaveInstanceState()
方法呢?这就得看情况了,如果你自己的派生类中有变量影响到UI,或你程序的行为,当然就要把这个变量也保存了,那么就需要自己实现,否则就不需要,但大多数情况肯定需要自己实现一下下了。