用于在系统由于内存紧张而回收程序的内存等情况时保存一些关键数据,对应的恢复数据函数为onRestoreInstanceState(Bundle savedInstanceState),也可以在函数onCreate(Bundle savedInstanceState)中来恢复数据。onSaveInstanceState通常在onPause()之后调用,但如果是按返回键等情况显式退出程序,则不会调用。保存及恢复数据时都用到一个Bundle对象,类似于一个map,可以存入键值对信息,但即使onSaveInstanceState调用了,也不保证之后重新进入程序会调用onRestoreInstanceState,同时onCreate中的Bundle对象也可能为null,只有当程序在后台运行时内存确实被系统回收了或者是横竖屏切换等情况,再次重新进入程序时,onCreate函数中的Bundle对象才不为null,并且存储了之前在onSaveInstanceState用户放入的数据,而onRestoreInstanceState函数也通常会在onResume()执行之前被调用。可以在onStop()函数中加入以下代码模拟程序被系统回收:
new Handler().post(new Runnable() {
publicvoid run() {
// TODO Auto-generated method stub
Runtime.getRuntime().exit(1);
}
});
在覆写onSaveInstanceState函数时记得调用父类对应函数,即super.onSaveInstanceState(),因为父类此函数的作用是保存android提供的各个view类如EditText等的数据,android的每个view类都提供了保存自己数据的函数,例如在EditText中输入了文本,这个文本数据会被存储下来,而这个存储行为是在super.onSaveInstanceState()中被执行的,同时,此EditText还需要在布局属性中加入id属性,否则数据无法被保存。同样在覆写onRestoreInstanceState函数时也要调用super.onRestoreInstanceState()函数,其对应着执行恢复EditText等android的View类的数据。
上述内容提到在横竖屏切换时会调用onSaveInstanceState,但这也是有条件的,当程序配置了对手机特定配置改变如横竖屏切换等的处理,即在manifest文件中activity标签下加入了android:configChanges="orientation|screenSize"(API 13以后需要这样配置),那么由于在横竖屏切换时只会调用onConfigurationChanged(Configuration newConfig)函数,而不会调用activity的任何生命周期函数,onSaveInstanceState函数也就不会被调用了。