后期测试的时候,发现有个偶然现象,当应用被切换到后台一段时间再切换回来的时候会莫名的崩溃,而且在log的错误信息,云测以及友盟的错误列表上都没有发现有错误日志输出。确实是比较棘手,但这确实是应用的bug,无法忽视,但是这个问题又无法很容易的重现。后期查找资料分析一下,可能是跟这几个原因有关:
1.没有很正确的理解getContext() , getActivity() ,Activity.this ,getApplicationContext的区别以及用法,乱用导致:
2.应用被切换到后台以后,由于android的内存回收机制,Activity切换到后台之后,由于内存不够,此Activity被系统回收了,一段时间之后回到该应用程序,Activity被重新实例化了。而Activity被系统销毁时,附属在该Activity的Fragment并没有被销毁,在Activity的onSaveInstanceState里面将Fragment状态保存起来了,所以Activity重新创建了,但是FragmentA和FragmentB还是之前的,而此时FragmentA和FragmentB所附属的Activity已经被系统回收了,这次再调用getActivity时返回了null,我们看看FragmentActivity源码中的onSaveInstanceState方法:
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
Parcelable p = mFragments.saveAllState();
if (p != null) {
outState.putParcelable("android:support:fragments", p);
}
}
由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。
解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
参考:http://www.cnblogs.com/liuling/p/2015-9-21-1.html
3.存在某些全局静态变量被释放回收掉,再次打开时,由于缺少值,在一些配置较低的终端上容易出现。4.还比如,从一个界面跳转到第二个界面时,存在传值,当在第二个界面时应用被切换到后台,当你再切换到前台时,在这第二个activity里,在其onResume()方法中做了数据访问用到了前一个界面的传值,当这个值已经被回收掉,这时就会crash掉了,多做些非空判断总归是有利无弊的。
造成这个问题的原因可能很多,以上是我个人的项目经验,仅代表个人观点,欢迎补充指正。