Activity后台运行一段时间回来crash问题

问题描述:

              我的app中某个界面的Activity是继承FragmentActivity,因为此界面包含两个Fragment。这里我称为

FragmentA和FragmentB吧。在FragmentA和FragmentB中传入了该activity实例,当应用程序运行到该

Activity时,按Home键将该应用程序放置后台运行,使用其他的app。一段时间后,又回到该应用程序,

结果程序crash了。以上就是我的业务场景,说简单点就是Fragment需要与它附属的Activity进行通信。


问题分析:

      刚开始遇到该问题时,查看奔溃日志,发现是空指针异常。因为这种场景不多,所以只是简单的加上

空判断就没在意这个问题了。到后面换了个测试机器,配置不是很好(只有512M运行内存),结果此

题频繁地出现。

      我们看看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的状态保存

了。

  原来Activity切换到后台之后,由于内存不够,此Activity被系统回收了,一段时间之后回到该应用程

序,Activity被重新实例化了。而Activity被系统销毁时,附属在该Activity的Fragment并没有被销毁,在

Activity的onSaveInstanceState里面将Fragment状态保存起来了,所以Activity重新创建了,但是

FragmentA和FragmentB还是之前的,而此时FragmentA和FragmentB所附属的Activity已经被系统回收

了,这次再调用getActivity时返回了null,才导致上面问题的出现。


问题解决:


  解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即

可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉

super.onSaveInstanceState(outState)就行了。

      Override
     protected void onSaveInstanceState(Bundle outState) {
           //super.onSaveInstanceState(outState);
     }




  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值