Activity数据恢复时移除Fragment数据

来源:互联网 发布:2k17右上角数据没有了 编辑:程序博客网 时间:2024/06/01 09:44

某些场景下(如内存不足),系统销毁 Activity 时会调用 onSaveInstanceState(),而 Fragment 也会在此方法中保存自身的状态。之后用户重新打开对应的 Activity 时,系统则会通过 onCreate(Bundle)或者 onRestoreInstanceState(Bundle) 恢复 Activity 的状态,而 Fragment 的状态会在 onCreate(Bundle) 中恢复。

某些特殊需求下,我们并不需要 Fragment 恢复之前的状态,那么就需要在 Fragment 数据恢复前移除 Fragment 的数据。首先我们来看一下 Activity 中是如何恢复 Fragment 数据的:

1
2
3
4
5
6
7
8
9
10
11
12
static final String FRAGMENTS_TAG = "android:fragments";
protected void onCreate(Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
...
}

从代码中可以看到,Activity 通过读取 savedInstanceState 中对应 key 为 FRAGMENTS_TAG 的 Parcelable 对象的值来恢复 Fragment 的状态。

所以我们可以通过这点入手来阻止 Fragment 状态恢复,代码如下:

原生:

原生 Fragment
1
savedInstanceState.remove("android:fragments");

Support 包:

Support 包的 Fragment
1
savedInstanceState.remove("android:support:fragments");