内存不足导致应用进程被杀

应用处于后台时,如果手机内存不足,应用进程会被强制杀掉. 如果通过最近打开的应用列表回到应用,那么首先会调起Application, 然后会恢复被杀之前的Activity, 如果Activity中含有Fragment, 那么Fragment也会被创建新的实例,但是应用中的其他单例等数据就会被清除。

生命周期

Android的组件都是有生命周期的,与用户交互的Activity和Fragment都有明确的生命周期。编写代码的时候尽量少用单例模式,单例模式的优点很明显:易于共享数据。但是单例模式没有生命周期,不能跟随Activity创建、销毁。

内存不足时会发生什么

当手机内存不足时,系统会根据每个应用的状态按优先级依次销毁应用的进程,以保证优先级高的应用能得到充足的内存。

如果应用在后台,如果系统内存不足,导致应用进程被杀。那么应用中所有在内存中的数据将会被清理,而且系统会保存当前应用的Activity栈信息。

应用进程被杀后,如果从桌面ICON重启,那么应用会像常规启动一样重启,一切都会很正常;如果从最近使用的应用列表中重启,那么系统会根据保存的Activity栈首先恢复栈顶的Activity, 如果用户不断返回上层,那么系统也会依次恢复Activity栈中的所有Activity, 如果含有Fragment, 那么Fragment的实例也会被系统自动创建。当然,不管用哪种方式返回应用,都会先启动Application。

应用重启后的数据恢复

Activity中持有的少量数据可以通过onSaveInstanceStateonCreate方法形参中的Bundle进行存储和恢复。如果使用了单例保存数据,那么重启后单例的数据就不复存在,所以要评估使用单例的风险。参考文章

遇到的问题

问题:应用中有大量情况使用了单例,而且单例中保存的数据很重要。

方案:在BaseActivity中代理子Activity的生命周期方法,Activity创建时,根据全局变量判断应用是否是被杀后重启,如果是,不调用子Activity的任何方法,直接启动LaunchActivity, 产生应用重新启动的现象,单例也就都会重新被创建。(方法很山寨,万不得已不要用)参考文章

问题:含有Fragment的Activity,使用MVP模式,应用被杀重启后没有重新创建Presenter。

方案:在Activity的OnCreate中,一定要创建Presenter的实例,不管Fragment是否为null, 都要创建Presenter. 因为应用被杀重启的情况下,内存中的Presenter实例已经被销毁,但是Fragment对象会被系统自行创建,所以在Activity#onCreate方法中会出现Fragment不为null, 但是Presenter为null的现象。

测试

模拟应用由于内存不足被杀有很多种方法,大家可以参考这篇文章,讲得很全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的后台进程白名单是指一些特定的应用程序或服务,在设备内存不足时也不会被系统自动终止。这些应用程序或服务被认为是重要的,需要保持运行状态以便能够继续提供其功能或服务。 在Android系统中,后台进程的终止是为了释放内存资源,以便给前台应用程序提供更好的运行环境。但是,一些应用程序或服务可能需要长时间运行,例如即时通讯、音乐播放器、下载器等,这些应用程序或服务需要在后台保持运行,以便用户能够随时使用它们。 为了满足这些需求,Android系统引入了后台进程白名单的概念。这个名单中的应用程序或服务被认为是重要的,即使设备内存不足时也不会被系统自动终止。通过将应用程序或服务添加到后台进程白名单,可以确保它们能够保持运行,并且能够继续提供其功能或服务。 但是,需要注意的是,过多地将应用程序或服务添加到后台进程白名单可能会导致设备内存不足,从而降低整体性能。因此,仅应将那些确实需要在后台持续运行的关键应用程序或服务添加到该白名单中。 总之,Android后台进程白名单可以确保一些重要的应用程序或服务不会被系统自动终止,从而保持其长时间运行和提供功能或服务的能力。这样,用户可以随时使用这些应用程序或服务,而不需要担心它们会因设备内存不足而被终止。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值