目录
[2.1 五种情况](#2.1 五种情况)
[2.2 注意事项:确定会被系统回收并销毁,不会调用此方法](#2.2 注意事项:确定会被系统回收并销毁,不会调用此方法)
[3.2 极端情况](#3.2 极端情况)
[3.3 两个方法间关系](#3.3 两个方法间关系)
4.onCreate()与onRestoreInstanceState()中Bundle区别
[4.1 Bundle?](#4.1 Bundle?)
[4.2 择优](#4.2 择优)
[4.3 两种方式代码实例](#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 两种方式代码实例
java
//保存和恢复数据
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//可以把要保存的静态全局变量先转成Json
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 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");
}