2018-06-06

字数 388阅读 13

原来Activity切换到后台之后,由于内存不够,此Activity被系统回收了,一段时间之后回到该应用程序,Activity被重新实例化了。而Activity被系统销毁时,附属在该Activity的Fragment并没有被销毁,在Activity的onSaveInstanceState里面将Fragment状态保存起来了,所以Activity重新创建了,但是FragmentA和FragmentB还是之前的,而此时FragmentA和FragmentB所附属的Activity已经被系统回收了,这次再调用getActivity时返回了null,才导致上面问题的出现。

我们看看FragmentActivity源码中的onSaveInstanceState方法:

1 protected void onSaveInstanceState(Bundle outState)
2 {
3 super.onSaveInstanceState(outState);
4 Parcelable p = mFragments.saveAllState();
5 if (p != null) {
6 outState.putParcelable(“android:support:fragments”, p);
7 }
8 }

由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。

问题解决:

知道问题的原因了,就好办了。解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。

1 @Override
2 protected void onSaveInstanceState(Bundle outState) {
3 // super.onSaveInstanceState(outState);
4 }

总结:

1、程序出现问题时,要先找出出现此问题的原因,对症下药才能从根本上解决问题。

2、对于Activity被系统回收导致的问题,可以使用切换横竖屏来模拟场景。

推荐阅读更多精彩内容