导读:本文大约2000字,预计阅读时间3分钟。本文纯属技术文,无推广。

正文

    首先应用进程的生命周期并不由应用本身直接控制,而是由系统综合多种因素来确定的。Android系统有自己的一套标准,它可以根据这套标准区分当前运行的所有进程的重要性。这是 Android 非常独特的一个基本功能。

在大多数情况下,每个 Android 应用都在各自的 Linux 进程中运行。当需要运行应用的一些代码时,系统会为应用创建此进程,并使其保持运行,直到不再需要它或者系统内存不足需要回收以供其他应用使用才会终止它。

我们作为应用开发者必须了解不同的应用组件(特别是 ActivityService 和 BroadcastReceiver)对应用进程的生命周期影响。这些组件使用不当会导致你的应用进程直接被终止,比如系统需要执行重要任务时。

举个我们常见的例子:

在我们使用 BroadcastReceiver 的 BroadcastReceiver.onReceive() 方法中接收到一个 Intent 时,它会启动一个线程,并从该函数返回。可是一旦返回,系统会认为 BroadcastReceiver 不再处于活动状态,然后就不再托管进程(除非其中有其他应用组件处于活动状态)。因此,系统可能会随时终止进程以回收内存,这样会导致在进程中运行的衍生线程直接终止而给我们的应用带来重大影响。

 解决办法:

要解决这个问题,通常可以从 BroadcastReceiver 调度 JobService,这样系统就知道进程中还有处于活动状态的任务正在进行中,从而不会去主动终止它。

但是,在系统内存不足的时候,系统还是会去终止一些应用的进程来释放足够的内存来保证系统的稳定性。要想了解系统是怎么选择被终止进程的,那就需要我们足够的了解系统“重要性优先级”:

前台进程是用户目前执行操作所需的进程。在不同的情况下,进程可能会因为其所包含的各种应用组件而被视为前台进程。如果以下任一条件成立,则进程会被认为位于前台:

条件一:它正在用户的互动屏幕上运行一个 Activit(其 onResume() 方法已被调用)。

条件二:它有一个 BroadcastReceiver 目前正在运行(其 BroadcastReceiver.onReceive() 方法正在执行)。

条件三:它有一个 Service 目前正在执行其某个回调(Service.onCreate()Service.onStart() 或 Service.onDestroy())中的代码。

系统中只有少数此类进程,而且除非内存过低,导致连这些进程都无法继续运行,才会在最后一步终止这些进程。

可见进程正在进行用户当前知晓的任务,因此终止该进程会对用户体验造成明显的负面影响。在以下条件下,进程将被视为可见:

条件一:它正在运行的 Activity 在屏幕上对用户可见,但不在前台(其 onPause() 方法已被调用)。举例来说,如果前台 Activity 显示为一个对话框,而这个对话框允许在其后面看到上一个 Activity,则可能会出现这种情况。

条件二:它有一个 Service 正在通过 Service.startForeground()(要求系统将该服务视为用户知晓或基本上对用户可见的服务)作为前台服务运行。

条件三:系统正在使用其托管的服务实现用户知晓的特定功能,例如动态壁纸、输入法服务等。

相比前台进程,系统中运行的这些进程数量较不受限制,但仍相对受控。这些进程被认为非常重要,除非系统为了使所有前台进程保持运行而需要终止它们,否则不会这么做。

服务进程包含一个已使用 startService() 方法启动的 Service。虽然用户无法直接看到这些进程,但它们通常正在执行用户关心的任务(例如后台网络数据上传或下载),因此系统会始终使此类进程保持运行,除非没有足够的内存来保留所有前台和可见进程。

已经运行了很长时间(例如 30 分钟或更长时间)的服务的重要性可能会降位,以使其进程降至下文所述的缓存 LRU 列表。这有助于避免超长时间运行的服务因内存泄露或其他问题占用大量内存,进而妨碍系统有效利用缓存进程。

缓存进程是目前不需要的进程,因此,如果其他地方需要内存,系统可以根据需要自由地终止该进程。在正常运行的系统中,这些是内存管理中涉及的唯一进程:运行良好的系统将始终有多个缓存进程可用(为了更高效地切换应用),并根据需要定期终止最早的进程。只有在非常危急(且具有不良影响)的情况下,系统中的所有缓存进程才会被终止,此时系统必须开始终止服务进程。

这些进程通常包含用户当前不可见的一个或多个 Activity 实例(onStop() 方法已被调用并返回)。只要它们正确实现其 Activity 生命周期(详情请见 Activity),那么当系统终止此类流程时,就不会影响用户返回该应用时的体验,因为当关联的 Activity 在新的进程中重新创建时,它可以恢复之前保存的状态。

这些进程保存在伪 LRU 列表中,列表中的最后一个进程是为了回收内存而终止的第一个进程。此列表的确切排序政策是平台的实现细节,但它通常会先尝试保留更多有用的进程(比如托管用户的主屏幕应用、用户最后看到的 Activity 的进程等),再保留其他类型的进程。还可以针对终止进程应用其他政策:比如对允许的进程数量的硬限制,对进程可持续保持缓存状态的时间长短的限制等。

在决定如何对进程进行分类时,系统会参考进程中当前活动的所有组件中最重要的级别。

进程的优先级也可能因从属于进程的其他依赖项而提升。例如,如果进程 A 已通过 Context.BIND_AUTO_CREATE 标记绑定到 Service,或在使用进程 B 中的 ContentProvider,则进程 B 的分类始终至少和进程 A 一样重要。

根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...相关推荐

  1. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

  2. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...

  3. linux使用安卓厨房,【图片】【教程】进阶教程之“使用安卓厨房制作/修改ROM包”【联想a798t吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 4.然后是美化 不喜欢或者不懂美化的同学可以绕过这一步了.这一步骤是毕竟比较难的,整个制作过程中涉及到手动反编译的就在这里. 美化主要是弄以下方面,修改s ...

  4. linux init进程原理,Linux 系统下 init 进程的前世今生

    原标题:Linux 系统下 init 进程的前世今生 Linux系统中的 init 进程 (pid=1) 是除了 idle 进程 (pid=0,也就是 init_task) 之外另一个比较特殊的进程, ...

  5. Supervisor-类unix系统下的进程控制工具

    如果你的英文足够好,请看官网的文档:http://supervisord.org/introduction.html 简介: Supervisor 类unix系统下的进程控制工具. 特性: 1.配置简 ...

  6. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)

    文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...

  7. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)

    文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...

  8. 【我的Android进阶之旅】Android 混淆文件资源分类整理之二:将混淆文件拆分成更小粒度的混淆文件

    在我2017年的文章[我的Android进阶之旅]Android 混淆文件资源分类整理中,我已经提及过. 之前将所有的混淆都配置在一个 proguard-rules.pro 这个Android Stu ...

  9. 【我的Android进阶之旅】Android混淆踩坑之各模块各自单独配置混淆,但是将minifyEnabled设置为true导致的编译错误

    一.背景描述 在之前的两篇文章中 [我的Android进阶之旅]Android 混淆文件资源分类整理 [我的Android进阶之旅]Android 混淆文件资源分类整理之二:将混淆文件拆分成更小粒度的 ...

最新文章

  1. 使用TS自动抓取镜像
  2. 店铺管理系统开发实践-领域模型
  3. 面试必问!有没有比读写锁更快的锁?
  4. 判断溢出(ybtoj-字符串)
  5. saml2_向SAML响应中添加自定义声明–(如何为WSO2 Identity Server编写自定义声明处理程序)...
  6. python修改文件名字数字_python实现多进程按序号批量修改文件名的方法示例
  7. java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
  8. weblogic 12C集群环境下的session复制
  9. Android实习结束后的阶段性总结
  10. qt 写的tcp客户端程序实现简单的连接接受和发送消息
  11. Java可视化编程【JFormDesigner安装教程】
  12. VLAN配置实验和TRUNK配置实验
  13. 学习Transformer:自注意力与多头自注意力的原理及实现
  14. 安防工程商选择千兆POE交换机的注意事项
  15. 交换机、路由器、网关的概念,并知道各自的用途
  16. zookeeper隐藏通道
  17. 【总结】解决Linux机器重装后-免密登录报错问题
  18. pdf裁边app_PDF切边裁剪(paper for kindle)
  19. Scrapy start_requests
  20. 四足机器人--腿部机械结构设计

热门文章

  1. java工具类下载_java文件下载工具类
  2. 白光干涉衍射实验的计算机仿真,白光干涉_衍射实验的计算机仿真_蓝海江.pdf
  3. verilog/VHDL实现JESD204B协议
  4. php字符串处理面试题,关于PHP字符串的一道面试题
  5. python源码编译安装 gb18030_源代码编译安装Python3.5.2
  6. wxpython bind自定义_wxPython的 - 如何从自定义对话框WX
  7. 华为 鸿蒙 升级,华为鸿蒙系统已陆续推送!安卓系统可无缝升级:升级包容量高达6GB...
  8. c#汉字拼音转换拼音
  9. codeforces上红记
  10. JS 删除 cookie