应用后台被回收,点击崩溃
2016-07-25 16:22
176 查看
今天测试提交了一个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方法:
由上面源码可以看出,FragmentActivity确实在onSaveInstanceState方法里面将Fragment的状态保存了。 知道问题的原因了,就好办了。解决方法其实很简单,我们只要让FragmentActivity被系统回收的时候,不保存Fragment的状态即可,即在FragmentActivity中重写onSaveInstanceState方法,并且注释掉super.onSaveInstanceState(outState)就行了。
问题解决!
首先查看了应用崩溃日志,发现不是经常报这个空指针,就是报那个空指针导致的(按下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) { }
问题解决!
相关文章推荐
- Android Fragment 常见问题及解决方案
- Activity的onSaveInstanceState调用时机
- Android中onSaveInstanceState和onRestoreInstanceSt...
- 移动应用崩溃了,你能怎么样?
- 四大组件之activity活动周期
- 异常情况下的生命周期分析
- Can not perform this action after onSaveInstanceState
- 状态保持与恢复onSaveInstanceState
- android开发怎样测验onSaveInstanceState方法
- activity state save
- Android中onSaveInstanceState和onRestoreInstanceState的调用
- Activity状态的保存与恢复
- 【Android进阶】Activity和Fragement中onSaveInstanceState()的使用详解
- Android - IllegalStateException: Can not perform this action after onSaveInstanceState
- Android - 解决onSaveInstanceState的Bug
- 【Android每周专题】横竖屏切换和Activity中View状态的保持
- Android开发之InstanceState详解
- Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机
- Android之onSaveInstanceState
- Android onPause和onSaveInstanceState的区别