android屏幕旋转fragment,Activity&Fragment中屏幕旋转数据处理

###前言

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值