应用后台被回收,点击崩溃

今天测试提交了一个bug,“启动应用,按下home键,玩玩其他的应用,然后在点击该应用,应用直接崩溃了!”

首先查看了应用崩溃日志,发现不是经常报这个空指针,就是报那个空指针导致的(按下Home键是处于不同的界面),再然后就是报“ Unable to start activity ComponentInfo{com.hbss.smarterstore/com.xx.yy.ui.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.xx.yy.ui.shopinfo.ShopDetailFragment: make sure class name exists, is public, and has an empty constructor that is public ”这个也报的很多。

我们都知道,如果系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致Fragment丢失对应的Activity。 而我的应用中就使用了很多Fragment,所以原因肯定是这个。
当应用在在台正常操作时,是没有报过这些错误的,所以肯定还是activity被销毁了导致的。

原来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
protectedvoid onSaveInstanceState(Bundle outState) {

}



问题解决!



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值