保存Activity的状态信息**
在前文提到过,处于暂停态的和停止态的Activity,其对应的状态的状态与成员信息依然保留在内存里。那么这些信息又是如何保存的??我们又应该如何去利用这些信息??
在暂停状态下的activity,因其activity信息完整保存在内存里且保持与窗口管理器的连接,所以可以直接调用onRestart()方法还原activity。
用户经常会使用返回按钮返回上一个界面(Activity),用户当然是希望上一个界面(Activity)和他原来看到或编辑的一样,在这种情况下你就需要使用之前已经保存好的状态信息和成员变量来还原上一个Activity。若要保存一个Activity的状态信息和成员变量,则需要实现回调方法onSaveInstanceState()。
onSaveInstanceState()会在执行``onStoped()``方法之前调用,这个方法有一个参数``Bundle``,可以以“名称``-``值”的形式保存``activity``的信息(如使用``putString(),putInt()``方法)。接着在需要还原``activity``时,系统会调用``onCreat()``或者
OnRestoreInstanceState(),这两个方法都传入一个以保存了activity信息的Bundle对象,通过提取Bundle对象的信息来恢复activity。如果没有信息需要保存到Bundle对象,那传递给这两个方法的将是空的Bundle对象(刚开始初始化一个activity时其实就是这种情况)。如下图所示:
其实,即使你没有实现回调方法[onSaveInstanceState()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)),``系统也会执行默认的
[onSaveInstanceState()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle))。``值得注意的是,系统会为每个``View``组件执行相对应的
[onSaveInstanceState()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)),这可以使每一个组件保存自己相对应的信息。在``Android``里,几乎所有的控件都实现了这个方法,因此在界面产生的可见变化都会自动保存下来,也就可以还原``activity``。举个例子:在``EditText``输入的内容或者``CheckBox``的选择,都会自动保存下来。而你所需要做的就是为需要保存信息的控件提供一个``id``(在``XML``文件里的属性
[android:id
](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/guide/topics/resources/layout-resource.html#idvalue)),如果你没有为控件提供id,那系统是不会自动保存这些信息的。
下面给出一些例子参考一下onSaveInstanceState()和OnRestoreInstanceState()方法的使用:
@Override
protected void OnSaveInstanceState(Bundle outState)
{
outState.PutString("myString", "HelloXamarin.Android OnSaveInstanceState");
outState.PutBoolean("myBool", true);
base.OnSaveInstanceState(outState);
}
@Override
protected void OnRestoreInstanceState(Bundle savedState)
{
base.OnRestoreSaveInstanceState(savedState);
var myString =savedState.GetString(amyStringa);
var myBool =GetBoolean(amyBoola);
}
附:如果需要强制控件不保存对应的信息,可以在布局文件设置[android:saveEnabled](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/R.attr.html#saveEnabled)= ``“``false``”,或者使用控件对象的
[setSaveEnabled()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/view/View.html#setSaveEnabled(boolean))方法。
尽管系统默认执行[onSaveInstanceState()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle))保存对应控件的信息,有时候你需要实现这个方法去保存一些额外的变量。例如:你需要去保存一些在这个activity生命周期里会改变的变量(指控件信息之外的变量),这些会改变的变量系统是默认不保存的。
需要注意的是:[onSaveInstanceState()](file:///D:/Program%20Files%20(x86)/Android/android-sdk/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle))方法不保证一定会被调用,所以在这个方法里你只应该保存一些临时变量(如``UI``的状态),而不要去保存一些需要持久化的数据。相反,你应该在``onPaused``()方法里保存需要持久化的数据(例如保存到数据库里的数据)。
tips``:
Android``系统上``Back``按钮和``Home``按钮的区别,尽管他们都可以导航到另外一个``otherActivity``(可以是其他程序的),可他们的作用原理是不一样的。在界面(``Activity``)上点击``Back``按钮,系统会认为这个``Activity``已完成其对应的实现逻辑,则调用对应的方法销毁此``Activity``;可当点击``Home``按钮时,系统会认为这个``Activity``还没有完成对应的逻辑,则系统并不会销毁这个``Activity``,而是让其处于停止态(``Stopped State``)``.