转自android Activity细节(一) onSaveInstanceState()方法使用注意点
1.在一个activity被销毁前,不一定会调用onSaveInstanceState()
这个方法,因为不是所有情况都需要去存储activity的状态(例如当用户按回退键退出你的activity的时候,因为用户指定关掉这个activity)。
2.如果这个方法被调用,它一定会在 onStop()
方法之前,可能会在onPause()方法之前。
3.布局中的每一个View默认实现了onSaveInstanceState()
方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动的恢复。但是这种情况只有在你为这个UI提供了唯一的ID之后才起作用,如果没有提供ID,将不会存储它的状态。
4.由于默认的onSaveInstanceState()
方法的实现帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()
方法(super.onSaveInstanceState()
)。
5.由于onSaveInstanceState()
方法调用的不确定性,你应该只使用这个方法去记录activity的瞬间状态(UI的状态)。不应该用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()
方法中存储持久化数据(例如应该被存储到数据库中的数据)。
文章链接:http://blog.csdn.net/murongshusheng/article/details/8199538
转自onSaveInstanceState和onRestoreInstanceState触发的时机
1、当用户按下HOME键时。
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,(本人注:我昨晚调试时就发现原来不一定成对被调用的!)
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putBoolean( "MyBoolean", true);
savedInstanceState.putDouble( "myDouble", 1.9);
savedInstanceState.putInt( "MyInt", 1);
savedInstanceState.putString( "MyString", "Welcome back to Android");
// etc.
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
boolean myBoolean = savedInstanceState.getBoolean( "MyBoolean");
double myDouble = savedInstanceState.getDouble( "myDouble");
int myInt = savedInstanceState.getInt( "MyInt");
String myString = savedInstanceState.getString( "MyString");
}