突发情况列举
点击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() 方法中来做。
我的微信二维码如下
微信订阅号二维码如下:
参考:
http://www.cnblogs.com/xiaoluo501395377/p/3418542.html
http://www.jianshu.com/p/6622434511f7
《第一行代码》