activity在按home后切换到后台一段时间就会被回收,并且我发现回收时甚至没有调用OnDestroy
尝试过很多方法:
1.android:alwaysRetainTaskState没有效果,时间久了仍然回收
2.startService,能使进程一直保持,但activity仍然被回收了
3.onSaveInstanceState
只能恢复一些基本类型的成员变量如String什么的,自定义的无法保持,且还是要通过OnCreate恢复
有没有办法保持这个activity,肯定是能做到的,但不知如何实现,例如手机qq就可以
- 我们知道,应用中Activity_A中启动Activity_B,Activity_A就会进入后台,这个时候就有可能由于系统内存不足,Activity_A就会被回收;
- 然后用户按下Back键返回到Activity_A,执行的并不是Activity_A的onRestart方法,而是onCreate方法,Activity_A会被重新创建;
- 但这个系统内存不足在好一点的手机上比较难遇到,有什么直接一点的办法吗?大家可以试试开发者选项中的 “不保留活动”。
- 这样设置之后,进入需要测试的应用后,点击home,让应用进入后台,在切换回前台,就可以发现Activity被回收了,再次进入,走的是onCreate流程;
二.Activity被回收导致fragment的getActivity为空
在编写含有Fragment代码的时候,经常会遇到这种情况,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠的现象。
如果系统内存不足、或者切换横竖屏、或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity。
这里,假设我们我们含有一个MainActivity里面包含了一个FramentA。
app发生的变化为:app长时间在后台运行,由于某种原因系统回收MainActivity——FragmentA被保存状态未被回收——再次点击app进入——首先加载的是未被回收的FragmentA的页面——由于MainActivity被回收,系统会重启MainActivity,FragmentA也会被再次加载——页面出现混乱,因为一层未回收的FragmentA覆盖在其上面——(假如FragmentA使用到了getActivity()方法)会报空指针,出现crash。
这种情况下,我们可以这样解决:
MainActivity重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果!