目录
1.二者作用
2.onSaveInstanceState调用时机
2.1 五种情况
前4种情况Activity生命周期:
2.2 注意事项:确定会被系统回收并销毁,不会调用此方法
两个例子
3.onRestoreInstanceState调用时机
3.1实例——屏幕切换生命周期
3.2 极端情况
3.3 两个方法间关系
4.onCreate()与onRestoreInstanceState()中Bundle区别
4.1 Bundle?
4.2 择优
4.3 两种方式代码实例
1.二者作用
Android系统的回收机制会在未经用户主动操作的情况下销毁activity
为了避免系统回收activity导致数据丢失
Android为我们提供了onSaveInstanceState(Bundle outState)和 onRestoreInstanceState(Bundle savedInstanceState)用于“保存和恢复”数据
2.onSaveInstanceState调用时机
只有在activity有可能被异常终止的情况下会被调用
2.1 五种情况
前4种情况Activity生命周期:
2.2 注意事项:确定会被系统回收并销毁,不会调用此方法
两个例子
1、用户按下返回键
2、调用finish()方法手动销毁Activity
3.onRestoreInstanceState调用时机
activity被系统回收,重新创建activity的情况下才会被调用。
3.1实例——屏幕切换生命周期
当屏幕反转切换时,是ActivityA的销毁与B的新建
onPause后需要onSaveInstanceState()保存,再在onCreate后执行该方法恢复数据
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
3.2 极端情况
而按HOME键返回桌面,又马上点击应用图标回到原来页面时
生命周期
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
activity没有被系统回收,不会调用onRestoreInstanceState()
3.3 两个方法间关系
调用onRestoreInstance() 一定 在上个Activity调用了onSaveInstance()
而调用了onSaveInstance()不一定,需要activity重建,才能调用onRestoreInstance()
4.onCreate()与onRestoreInstanceState()中Bundle区别
4.1 Bundle?
onCreate()里的Bundle参数可能为空
只有在上次activity被回收了才会调用onRestoreInstanceState(),所以Bundle一定非空
4.2 择优
有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据;
而onRestoreInstanceState是在onStart()之后被调用的;
所以用onRestoreInstanceState会比较方便。
4.3 两种方式代码实例
//保存和恢复数据
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//可以把要保存的静态全局变量先转成JsonsavedInstanceState.putBoolean("MyBoolean", true);savedInstanceState.putDouble("myDouble", 1.9);savedInstanceState.putInt("MyInt", 1);savedInstanceState.putString("MyString", "Welcome back to Android");// etc.super.onSaveInstanceState(savedInstanceState);
}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
// 从savedInstanceState中恢复数据,如果没有需要恢复数据savedInstanceState为nul if (savedInstanceState != null) {boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");double myDouble = savedInstanceState.getDouble("myDouble");int myInt = savedInstanceState.getInt("MyInt");String myString = savedInstanceState.getString("MyString");}}
//或在onRestoreInstanceState恢复数据
@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");
}