https://developer.android.google.cn/guide/components/activities/process-lifecycle.html

在大多数情况下,每个Android应用程序都在自己的Linux进程中运行。当应用程序的一些代码需要运行时,系统为应用程序创建这个进程,并且将继续运行直到不再需要它,系统需要回收它的内存以供其他应用程序使用。

Android的一个不同寻常的基本特性是,应用程序的生命周期不是由应用程序本身直接控制的。相反,系统通过系统知道的正在运行的应用程序的各个部分的组合,这些东西对用户有多重要,以及系统中有多少可用内存来决定进程的生命周期。

应用程序开发人员了解不同的应用程序组件(特别是activity、服务和广播接收器)如何影响应用程序进程的存在期,这一点非常重要。不正确使用这些组件会导致系统在执行重要工作时杀死应用程序的进程。

进程生命周期错误的一个常见的例子是BroadcastReceiver在BroadcastReceiver.onReceive()方法中收到一个intent时启动一个线程,然后从该函数返回。一旦它返回,系统就会认为广播接收器不再活动,因此不再需要它的托管进程(除非其他应用程序组件在其中活动)。因此,系统可能随时终止进程以回收内存,并在此过程中终止运行在进程中的派生线程。这个问题的解决方案通常是在广播接收器中安排一个JobService,这样系统知道在这个过程中仍然有工作正在进行。

为了确定在内存不足时应该杀死哪些进程,Android将每个进程置于一个“重要性层次结构”中,这个结构基于它们运行的组件和这些组件的状态。这些进程类型(按重要性排序):

  • 前台进程是用户当前正在做的事情。各种应用程序组件可以以不同的方式使包含它的进程被视为前台进程。如果有下列条件之一,则认为进程处于前台:

    • 它在用户正在与之交互的屏幕顶部运行一个activity(它的onResume()方法已被调用)。
    • 它有一个BroadcastReceiver目前运行(其BroadcastReceiver.onReceive()方法执行)。
    • 它有一个当前在其回调函数中执行代码的服务(Service. oncreate()、Service. onstart()或Service. ondestroy())。

在系统中只会有一些这样的进程,如果内存太低,甚至这些进程都无法继续运行,那么这些进程将会作为最后的手段被杀死。通常,在这一点上,设备已经达到内存分页状态,因此需要采取这种操作,以保持用户界面的响应。

  • 可见进程 正在做用户目前知道的工作,所以杀死它会对用户体验产生明显的负面影响。在以下条件下,进程被认为是可见的:

    • 它运行的activity是在屏幕上可见的,但不是在前台(它的onPause()方法被调用)。例如,如果前台activity显示为一个对话框,能在它后面看到之前的activity,则可能会出现这种情况。
    • 它有一个通过 Service.startForeground()(它要求系统将服务视为用户知道的东西,或者从本质上来说是可见的) 作为前台服务运行的服务。
    • 它正在托管一个服务,系统使用该服务执行用户所知道的特定功能,如实时壁纸、输入方法服务等。

系统中运行的这些进程的数量比前台进程的限制少,但仍然相对可控。这些进程被认为是非常重要的,不会被杀死除非这样做是为了保证前台进程运行。

  • 服务进程是一个包含了使用startService()方法启动的服务的进程。虽然这些过程对用户来说不是直接可见的,但是他们通常都在做用户关心的事情(比如后台网络数据上传或下载),所以系统将始终保持这样的进程,除非没有足够的内存来保留所有前台和可见的进程。

已经运行了很长时间(比如30分钟或更长时间)的服务可能会被降级,从而允许它们的进程被降到接下来描述的缓存的LRU列表中。这有助于避免长时间运行的服务由于内存泄漏或其他问题占用大量内存而导致系统无法有效使用缓存进程的情况。

  • 缓存的进程是当前不需要的,因此当需要其他地方需要内存时,系统可以随意地杀死它。在正常运行的系统中,这些是涉及内存管理的唯一进程:一个运行良好的系统将会有多个始终可用的缓存的进程(以便在应用程序之间进行更有效的切换),并根据需要定期杀死最老的进程。只有在非常临界的(且不受欢迎)的情况下,系统才会到达杀死所有缓存进程的点,并且它必须开始杀死服务进程。

这些进程通常包含一个或多个用户不可见的activity实例(onStop()方法已被调用并返回)。如果他们正确地实现了activity生命周期,当系统杀死这些过程时,它不会影响用户返回到该应用程序时的体验:当关联的activity在一个新进程中重新创建时,它可以恢复先前保存的状态。

这些进程被保存在一个伪lru列表中,其中列表的最后一个进程是第一个被杀死的以回收内存的进程。在这个列表上排序的确切策略由平台来实现细节,但是通常它会保留更多有用的进程(托管了用户的主页的进程,用户看见的最后一个activity,等等)而不是其他类型的进程。其他用于杀死进程的策略也会应用:对允许的进程数量的严格限制,对进程可以持续缓存的时间的限制等。

在决定如何对流程进行分类时,系统将根据在进程中当前activity的所有组件中发现的最重要的级别来决定。

一个进程的优先级也可以根据进程对它的依赖程度来增加。例如,如果进程A使用Context.BIND_AUTO_CREATE标志绑定到一个服务,或使用了一个在进程B中的ContentProvider,那么进程B的分类将总是和进程A一样重要。

转载于:https://www.cnblogs.com/tysdeblog/p/8583400.html

进程和应用程序生命周期相关推荐

  1. android应用开发(25)---进程和应用程序生命周期

    进程和应用程序生命周期 在大多数情况下,每个Android应用程序都在其自己的Linux进程中运行.当需要运行某些代码时,会为应用程序创建此进程,并且该进程将保持运行状态,直到不再需要它为止,并且 系 ...

  2. ASP.NET 应用程序生命周期概述

    本主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程序生命周期的代码.在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它处理请求,必须执行一些处理步骤.此 ...

  3. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期

    本文内容 应用程序生命周期概述 生命周期事件和 Global.asax 文件 编译生命周期 HTTP 模块 本文概述 VS 2008 ASP.NET 应用程序的生命周期,列出了重要的生命周期事件,并描 ...

  4. ASP.NET页面生命周期与应用程序生命周期

    页面生命周期 页面生命周期执行一系列步骤:页面的初始化.实例化控件.还原和维护状态.运行事件处理程序代码.呈现.为了在合适的阶段执行所需的代码,所以要对页面生命周期非常熟悉.在页生命周期的各个阶段,页 ...

  5. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

    http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspx 在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它 ...

  6. IIS 7.0 的 ASP.NET 应用程序生命周期概述

    本主题介绍在 IIS 7.0 集成模式下运行以及与 .NET Framework 3.0 或更高版本一起运行的 ASP.NET 应用程序的应用程序生命周期.IIS 7.0 还支持经典模式,其行为类似于 ...

  7. 【转】Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  8. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

  9. linux-进程的理解-进程的状态与生命周期

    程序与进程 程序是静态的代码文件 进程是运行起来的程序 生命周期 进程状态

最新文章

  1. cmd启动tomcat
  2. ubuntu14.04中安装opencv2.4.13
  3. OpenLayers事件处理Event.js(七)
  4. android singleInstance返回问题
  5. 策略模式和自定义排序规则
  6. python seaborn 热图_python – 在seaborn中结合两张热图
  7. Spring AOP 前置通知
  8. “iexplorer.exe遇到问题需要关闭”问题的处理
  9. Android游戏开发基本知识
  10. Python Web项目自定义虚拟环境
  11. Eclipse内置Tomcat的配置
  12. python模块:网络协议和支持
  13. 评价好的良心浏览器,最后一个比360浏览器好用
  14. C# webbrowser爬虫中经常碰到的脚本错误弹出窗口的问题解决
  15. 极限思想之阿基里斯和乌龟赛跑
  16. matlab 逆滤波,【CV】图像去模糊(逆滤波)
  17. matlab 图像处理 消除锯齿,Matlab图像处理,锯齿阵列图像
  18. python爬取公众号文章_python爬取微信公众号历史文章
  19. dns遭到劫持什么意思、dns遭到劫持怎么办有什么方法解决
  20. 解决Ubuntu系统设置打不开

热门文章

  1. 擦地机器人毕业设计_救援机器人毕业设计
  2. 简述python中的内存管理机制_Python中的内存管理机制
  3. 支持mysql8的客户端_mysql8 参考手册--mysql客户端帮助
  4. oracle crm客户关系管理资料下载_悟空CRM:使用CRM系统进行客户关系管理的要点...
  5. win98 老电脑 文件导出_UGNX利器:轻量化建模,很多人还傻傻的关注电脑配置
  6. java 实体类属性排序_按照list中实体类的某一属性排序
  7. java 日期年度 35变2035_连接IBM MQ原因码报2035的错误解决办法
  8. python 字符串函数_Python字符串函数
  9. 功能接口 java8_Java 8功能接口
  10. Spring 4 Security MVC登录注销示例