学习Activity的生命周期,我们知道,当Activity进入到paused或者stopped状态后,这个Activity的状态仍然保存着。因为这个Activity对象仍然保存在内存中,它的所有信息和状态仍然是存在的,当这个Activity再次返回到前台是,它仍然保持着离开时候的样子。
然而,如果Activity进入到了后台,系统为了回收内存,有可能会去销毁该Activity,那么,当用户通过导航返回的时候,系统就不能简单的去恢复这个Activity,而是会重新创建这个Activity对象。但是对于普通用户来说,他并不知道系统销毁了Activity并重新创建它,因此,可能希望该Activity保存和他离开时候一样的状态。
在这种情况下,您可以通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息。
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.d("roamer", "onSaveInstanceState"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("roamer", "onCreate"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.d("roamer", "onRestoreInstanceState"); }
过程如下图:
注意:并不是每一次Activity销毁,系统都回去回调onSaveInstanceState()方法,我们是我们自己finish掉该Activity,那么onSaveInstanceState()方法就不会被调用。
并且系统调用onSaveInstanceState()方法的时机一般是在onStop()之前,但是也有可能是onPause之前。
并且系统调用onRestoreInstanceState()的时机,是在onStart()之后,onResume之前。
//View的onRestoreInstanceState()方法 //该方法允许每个View提供自己需要保存的信息 @Override protected void onRestoreInstanceState(Parcelable state) { // TODO Auto-generated method stub super.onRestoreInstanceState(state); }
尽管系统帮我们实现了UI组建的自动保存和恢复,但是有时候也需要去保存和恢复一些其他的成员变量。在这种情况下,记得重写onSaveInstanceState()和onRestoreInstanceState()方法是,记得带上super方法的实现,因为那里就是系统UI组件自动保存和恢复的默认实现。
注意:因为onSaveInstnceState()方法并不是Activity销毁前一定被执行,所以你最好仅仅保存与Activity状态相关的信息(UI状态)。你不应该去保存那些持久化的数据,那些持久化的数据应该放到onPause方法里面去执行(比如将数据存储到数据库中)。