应用切换到后台一段时间再切回来会崩溃

  后期测试的时候,发现有个偶然现象,当应用被切换到后台一段时间再切换回来的时候会莫名的崩溃,而且在log的错误信息,云测以及友盟的错误列表上都没有发现有错误日志输出。确实是比较棘手,但这确实是应用的bug,无法忽视,但是这个问题又无法很容易的重现。后期查找资料分析一下,可能是跟这几个原因有关:

1.没有很正确的理解getContext() , getActivity() ,Activity.this ,getApplicationContext的区别以及用法,乱用导致:

Context:上下文(指的就是这个应用运行所依赖的运行环境), Context分类:
       ①.Activity:具体的上下文环境;Activity.this的context属于activity ,activity 摧毁他就摧毁
       ②.ApplicationContext:整体的上下文环境;getApplicationContext()通过该方法获取,getApplicationContext() 生命周期是整个应用,应用摧毁它才摧毁 
       ③getContext();. getContext获取的是当前对象所在的Context
对于绝大多数场景,使用Activity或者是ApplicationContext效果都一样.
activity.this要返回一个activity,而getApplicationContext()就不一定返回一个activity
      但是有些特殊情况下,使用Activity这种上下文的地方,不可以使用ApplicationContext;
      也有些地方,使用ApplicationContext的地方,也不能使用Activity:一般是需要对全局做初始化操作的时候.

 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掉了,多做些非空判断总归是有利无弊的。

造成这个问题的原因可能很多,以上是我个人的项目经验,仅代表个人观点,欢迎补充指正。




你可能感兴趣的:(crash)