#突发情况列举

点击back键

点击锁屏键

点击home键

其他APP进入前台

启动了另一个Activity

屏幕方向旋转

APP被Kill

只有点击back键,onSaveInstanceState方法不会调用。其余的情况下, 该方法一律都会调用,onPause()一定会调用。

#onSaveInstanceState何时调用

Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother
calling it when the instance is actually being destroyed by a user
action (such as pressing the BACK key)

比如按住返回键主动销毁时候,onSaveInstanceState不会调用。当我们的Activity处于极易被摧毁的时候,系统会调用 onSaveInstanceState() 方法。

#Android View控件的onSaveInstanceState()方法

当我们在创建一个Activity对象的时候,我们如果没有重写父类的 onSaveInstanceState()方法,此时我们的一些Activity状态也会通过调用父类Activity的默认的 onSaveInstanceState()方法来保存下来。特别地:父类的onSaveInstanceState()方法会调用布局文件中每一个View对象的相应的 onSaveInstanceState()方法 来保持各自的状态。在Android的大多数的widget控件都非常好的实现了 onSaveInstanceState()方法,因此我们对这些空间的值的改变都会被自动的保存下来。例如我们的EditText、Checkbox控件,当我们在输入了我们的值只会,当Activity被destroy–>recreate的时候,此时我们的值仍然会被保存下来。
#前提是:
如果我们需要保存一个View控件的状态,我们必须要给其指定一个唯一的标识符(通过 android:id 属性来指定),如果我们没有指定的话,系统则不会保存其状态。

##对于一些不能自动保存状态的控件,就需要手动去实现##

保存数据:

protected void onSaveInstanceState(Bundle bundle){
super.onSaveInstanceState(outState);
String tempData = textView.getText();//textView指活动中声明的TextView控件
bundle.putString("data",tempData);
}

恢复数据:在onCreat()方法中有Bundle类型的参数,一般情况下都是null。但是当活动被系统回收之前有通过onSaveInstanceState()方法来保存数据的话,这个参数就会带有之前所保存的全部数据,只需要再通过相应的取值方法将数据取出即可。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data");
}
……
}

#总结
尽管默认的Activity的onSaveInstanceState() 方法会保存我们的View控件的状态,但是我们仍然推荐重新其onSaveInstanceState() 方法来保存我们额外的一些Activity的状态,在分别重写 onCreate()、onSaveInstanceState() 和 onRestoreInstanceState()方法时,我们要首先调用父类的方法才行,这样就会默认的保存我们View控件的状态了。

因为 onSaveInstanceState() 方法不能保证一定会被调用,所以我们在onSaveInstanceState() 方法中只能用来保存我们的Activity的临时的状态信息,而对于要持久化保存的对象或状态,我们应该在 onPause() 方法中来做。