[Android] 阻止特定 Fragment 被恢复

Preface

Activity 在经过旋转屏幕(或者其他原因导致配置变更)时,该 Activity 将被销毁并重新创建。
如果 Activity 内放置了 Fragment,Fragment 也会被销毁但会被 FragmentManager 恢复出来,这就带来了一个问题:有些 Fragment 因为时效性问题或者其它原因不需要被恢复。
下面就来解决这个问题。

启发

最开始是在 StackOverflow.com 看到了 这个 回答,看了下 Activity 的源码后发现 Fragment 的状态存放在 savedInstanceState.get(FRAGMENTS_TAG) 里,于是只要 savedInstanceState.remove(FRAGMENTS_TAG) 就能防止 Fragment 被恢复了。但这会导致所有的 Fragment 都不能被恢复,而我希望的是不恢复某个 Fragment 就足够了。
后来又花了一些时间调试一下代码,最后把知识都总结到这个类文件里了:

用法

FragmentStateUtil 也很好用:

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
try {
FragmentStateUtil lFragmentStateUtil = new FragmentStateUtil(this, savedInstanceState);
lFragmentStateUtil.dropFragmentState(DontRestoreThisFragment.class);
} catch (Exception ignore) {
ignore.printStackTrace();
}
super.onCreate(savedInstanceState);
// Your code.
}

上述代码可以使 DontRestoreThisFragment 不会被 FragmentManager 恢复出来。

References

  1. Prevent Fragment recovery in Android - stackoverflow.com
  2. Utility class help you to drop Fragment state before it’s being restored. - gist.github.com