###前言
Fragment 与 Activity 的生命周期紧密相连(自从activity的创建都基于AppCompatActivity后,这里所言的activity实际是继承自AppCompatActivity的activity),那么今天我们就来探讨下 onSaveInstanceState 和 onRestoreInstanceState 这两个方法分别在 FragmentActivity 与 Fragment中的表现。
今天涉及的内容有:
1. onSaveInstanceState 与 onRestoreInstanceState 简单介绍
2. onSaveInstanceState 与onRestoreInstanceState 在Activity 中的表现
3. onSaveInstanceState 在Fragment中的表现
4. 效果图和项目结构图
先看下效果图
![](/contentImages/image/20190806/4Xs0bNz3ilhf70rNVxk.gif)
####一. onSaveInstanceState 与 onRestoreInstanceState 简单介绍
onSaveInstanceState 方法全称为:
```
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
```
它主要用于数据的保存,onSaveInstanceState 据说会在以下几种情况下执行:
- 当用户按下HOME键时。
- 长按HOME键,选择运行其他的程序时。
- 按下电源按键(关闭屏幕显示)时。
- 从activity A中启动一个新的activity时。
- 屏幕方向切换时,例如从竖屏切换到横屏时。
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
onRestoreInstanceState 方法全称:
```
protected void onRestoreInstanceState(Bundle savedInstanceState)
```
主要用于界面切换回来的时候,恢复onSaveInstanceState中保存的数据。
####二. onSaveInstanceState 与onRestoreInstanceState 在Activity 中的表现
先写一个MainActivity,然后重写onSaveInstanceState 和onRestoreInstanceState 方法,如下:
```
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData(savedInstanceState);
}
/**初始化数据**/
private void initData(Bundle savedInstanceState){
if(savedInstanceState==null){
LogUtil.i("========为null=========");
}else{
LogUtil.i("========不为null=========");
// LogUtil.i("========不为null========="+savedInstanceState.toString());
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("mDatas", "khn");
LogUtil.i("========onSaveInstanceState=====mData="+mData);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState!=null){
mData = savedInstanceState.getString("mDatas");
}
LogUtil.i("========onRestoreInstanceState=====mData="+mData);
}
}
```
发现在app刚启动的时候,MainActivity中的onCreate(@Nullable Bundle savedInstanceState) 执行,显示savedInstanceState参数为null,然后app锁屏或程序切入后台再返回回来的时候,onSaveInstanceState 与 onRestoreInstanceState均不执行,只有当app切换屏幕方向的时候,onRestoreInstanceState执行,onSaveInstanceState不执行。由于onSaveInstanceState未执行,导致onRestoreInstanceState恢复的时候,取到的存值为null。
####三. onSaveInstanceState 在Fragment中的表现
ok,现在建一个TestFragment继承自Fragment,然后由MainActivity去启动它,然后在TestFragment中重写onSaveInstanceState 与onRestoreInstanceState(由于Fragment中无onRestoreInstanceState方法,则onSaveInstanceState 存储的数据,可以在onCreateView中接收),具体如下:
```
public class TestFragment extends AppFragment {
@Override
protected void onVisible(boolean isFirstTimeLoad) {
}
@Override
protected void onInvisible() {
}
@Override
public int getContentViewId() {
return R.layout.fragment_test;
}
@Override
public void initData() {
}
@Override
public void setListener() {
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("A","fragment");
LogUtil.i("=======fragment====save====");
}
@Override
protected void onCreateFragmentView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateFragmentView(inflater, container, savedInstanceState);
String kk=null;
if(savedInstanceState!=null){
kk =savedInstanceState.getString("A");
}
LogUtil.i("==fragment===kk======"+kk);
}
}
```
然后经过测试,发现Fragment中,当手机将app切入后台,锁屏,旋转屏幕的时候,onSaveInstanceState均执行,但onCreateFragmentView只是在旋转屏幕的时候执行。
####四. 效果图和项目结构图
![](/contentImages/image/20190806/4Xs0bNz3ilhf70rNVxk.gif)
![](/contentImages/image/20190806/2mv1IDRcVmg3LfTDueO.png)