应用处于后台时,如果手机内存不足,应用进程会被强制杀掉. 如果通过最近打开的应用列表回到应用,那么首先会调起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的现象。

测试

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

内存不足导致应用进程被杀相关推荐

  1. windows2003中未分页内存泄漏导致服务器不稳定的解决方法

    2015年天互进行了内部员工干货分享计划,让销售.技术.客服.市场.行政五大体系的员工把自己工作中的干货内容分享给大家,共同提高业务能力和工作效率.本篇内容来自虚拟产品部姚运的技术日志分享," ...

  2. python2执行程序内存溢出导致被killed的问题因果分析

    问题来源: 执行一段程序,对某个函数重复执行,当执行到一半时,就显示被killed,重复几次均如此.为什么会这样呢? 第一步.定位被killed的根本原图: 使用vi /var/log/message ...

  3. 硬核分析|腾讯云原生OS内存回收导致关键业务抖动问题

    实战系列: 精选各种常见的代表性实际问题,分享一步一步思考和解决方法,梳理整个问题脉络,可以学习到解决问题各种技巧和通用技能,锻炼解决问题思维能力,让大家成为解决问题的高手: 往期文章推荐: 一个刁钻 ...

  4. drools规则引擎因为内存泄露导致的内存溢出

    进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...

  5. 32位Windows系统未分页内存限制导致的VPS的容量问题

    问题 32位Windows系统未分页内存限制导致的VPS的容量问题 解决方案 在32位的Windows系统上,制约VPS的数量的主要参数是"未分页内存" 打开Windows自己的任 ...

  6. 由SGA组件内存移动导致前台业务超时问题处理过程

    墨墨导读:Oracle 11g推出了自动内存管理(AMM)新特性,该特性引入后,虽然减轻了DBA手动设置共享内存的负担,但是会存在不稳定的情况,经常出现在shared pool和buffer cach ...

  7. 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障

    蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. ## 导语 云原生场景,相比于传统的IDC场景,业务更 ...

  8. Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白、异常解决方案(提供模拟内存不足导致系统回收内存的方案)。

    Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白解决方案. 首先提供一个方法模拟内存不足导致系统回收内存的方案: 打开Andro ...

  9. 服务器内存不足导致程序(tomcat)崩溃

    服务器内存不足导致程序(tomcat)崩溃 场景 场景 在同一台服务上部署了多个tomcat,每个tomcat上都运行项目: 通过命令netstat -ntlp查看运行的java进程及对应的端口信息 ...

最新文章

  1. ant-design-pro Login 中的 UserName 和 Password 的验证规则 rules
  2. bzoj3224: Tyvj 1728 普通平衡树(splay)
  3. leetcode - Missing Ranges
  4. Spring实战第七章
  5. 玩转java并发工具_玩Java并发
  6. Serverless 架构到底要不要服务器?
  7. 为 Windows 用户准备的简明 Linux 词汇表
  8. drools 7.11 复杂事件处理详解
  9. Scikit-Learn与回归树
  10. POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析
  11. 误删除 Oracle 数据库数据的恢复方法
  12. python version 3_VIM设置python3支持和检测python version
  13. 打包下载 java_java实现文件打包下载
  14. LED灯恒流驱动电路设计
  15. Linux系统基于MobaXterm的下载及使用
  16. Win系统 - Win10 进入 BIOS 系统(非启动快捷键)
  17. 腾讯云MySQL备份本地恢复
  18. 国外EDU教育邮箱功能简介
  19. #力扣 LeetCode35. 搜索插入位置 #在所有 Java 提交中击败了 100.00% 的用户 @FDDLC
  20. charles安装证书并信任证书,仍然无法获取手机上的请求

热门文章

  1. 彩票开奖系统PHP,彩票开奖API接口_免费数据接口 - 极速数据
  2. H5新特性 - 拖拽属性
  3. Task01算法的规范化和量化度量
  4. linux下mysql乱码,Linux下mysql中文乱码解决方案
  5. R沟通|提升xaringan幻灯片的b格
  6. Postman自动更新后打不开,collections接口目录突然消失
  7. Maven项目配置Tomcat
  8. *.github.io的个人博客网站无法连接的问题
  9. 朋友圈加粗字体数字_独家:微信更新!公众号改版,朋友圈视频号直播置顶支持一键关闭...
  10. 9个绝招巧妙应付公司各类人