美文网首页
如何防止activity回收?

如何防止activity回收?

作者: cain07 | 来源:发表于2021-10-27 21:20 被阅读0次

    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会被重新创建;
    • 但这个系统内存不足在好一点的手机上比较难遇到,有什么直接一点的办法吗?大家可以试试开发者选项中的 “不保留活动”。
    image
    • 这样设置之后,进入需要测试的应用后,点击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一起被回收的效果!
    

    相关文章

      网友评论

          本文标题:如何防止activity回收?

          本文链接:https://www.haomeiwen.com/subject/uwopaltx.html