进程和应用程序生命周期

在大多数情况下,每个Android应用程序都在其自己的Linux进程中运行。当需要运行某些代码时,会为应用程序创建此进程,并且该进程将保持运行状态,直到不再需要它为止,并且 系统需要回收其内存供其他应用程序使用。

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

重要的是,应用程序开发人员了解不同应用程序组件(特别是ActivityServiceBroadcastReceiver)影响应用程序的进程的生存期。 如果不正确使用这些组件,可能会导致系统在执行重要工作的同时终止应用程序的进程。

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

要确定哪些进程在内存不足时应该被终止,Android会根据其中运行的组件以及这些组件的状态将每个进程置于“重要性层次结构”中。这些流程类型(按重要性排序):

  1. 一个前台进程是需要什么样的用户目前正在做一个。各种应用程序组件可以使其包含的过程以不同的方式被视为前景。如果满足以下任何条件,则认为过程处于前景中:

    • Activity 在用户正在与之交互的屏幕顶部运行(其 onResume()方法已被调用)。
    • 它有一个BroadcastReceiver正在运行的程序(它的BroadcastReceiver.onReceive()方法正在执行)。
    • 它有一个Service当前在其回调之一执行代码(Service.onCreate(), Service.onStart(),或Service.onDestroy())。

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

一个可见的进程正在做用户当前意识到的工作,所以杀死它会对用户体验产生显着的负面影响。在下列情况下,流程被视为可见:

  • Activity 在屏幕上运行一个对用户是可见的,但不在前台(它的 onPause()方法已被调用)。例如,如果前景活动显示为允许在其后面看到先前活动的对话框,则可能发生这种情况。
  • 它有一个Service作为前台服务运行的服务,通过Service.startForeground()(这是要求系统将服务视为用户知道的事情,或者基本上对他们可见)。
  • 它正在托管系统正在使用的用于用户知晓的特定功能的服务,例如动态壁纸,输入法服务等。

在系统中运行的这些进程的数量比前台进程的限制更少,但仍然相对受控。这些进程被认为是非常重要的,并且不会被杀死,除非需要这样做来保持所有前台进程的运行。

一个服务的进程是一个拿着Service 已经开始与 startService()方法。虽然这些过程对用户来说不是直接可见的,但他们通常在做用户关心的事情(如后台网络数据上传或下载),所以除非没有足够的内存来保存所有内容前景和可见过程。

长时间运行(例如30分钟或更长时间)的服务可能被降级为重要的,以允许它们的进程下降到下面描述的缓存的LRU列表。这有助于避免由于内存泄漏或其他问题而长时间运行的服务消耗大量内存,导致系统无法有效使用缓存进程。

缓存进程是一个当前没有必要,因此系统是免费时别处需要存储器根据需要将其杀死。在正常运行的系统中,这些是内存管理中唯一涉及的过程:运行良好的系统将始终有多个高速缓存的进程可用(以便在应用程序之间进行更高效的切换),并根据需要定期清除最旧的进程。只有在非常危急的情况下(也就是不希望出现的情况),系统才能达到所有高速缓存进程都被终止的程度,并且它必须开始查杀服务进程。

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

这些进程保存在一个伪LRU列表中,列表中的最后一个进程首先被杀死以回收内存。在此列表中排序的确切策略是平台的实现细节,但通常它会尝试在其他类型的进程之前保留更有用的进程(一个托管用户的home应用程序,他们看到的最后一个活动等)。还可以应用其他杀死进程的策略:对所允许的进程数量进行严格限制,限制进程可以连续缓存的时间量等。

在决定如何对流程进行分类时,系统将根据在流程中当前活跃的所有组件中找到的最重要级别来决定其决策。见ActivityService和 BroadcastReceiver文档,了解每个组件有助于进程的整体生命周期的更多细节。每个类的文档都会更详细地描述它们如何影响其应用程序的整个生命周期。

流程的优先级也可以基于流程对其的其他依赖性来增加。例如,如果进程A已经ServiceContext.BIND_AUTO_CREATE标志绑定 或正在使用 ContentProvider进程B,那么进程B的分类至少与进程A一样重要。

android应用开发(25)---进程和应用程序生命周期相关推荐

  1. 进程和应用程序生命周期

    https://developer.android.google.cn/guide/components/activities/process-lifecycle.html 在大多数情况下,每个And ...

  2. android应用开发(22)---Activity的生命周期

    了解活动生命周期 当用户浏览,浏览并返回到您的应用程序时,应用程序中的 Activity实例将在其生命周期中的不同状态中转换.的Activity类提供了一些回调允许活动知道一个状态已经改变的:该系统被 ...

  3. 微信小程序开发:微信小程序生命周期总结

    前言 在微信小程序开发中,关于微信小程序API的使用是必备技能,但是关于微信小程序的生命周期也是首先要了解和掌握的知识点.尤其是现在的前端开发领域,关于前端的各种框架和技术都要会,而且微信小程序的语法 ...

  4. Android studio开发-单界面单机小程序

    Android studio开发-单界面单机小程序 最终结果展示 步骤: 建立项目 file-new-new project 新建一个项目文件 选择一个empty activity 配置项目名称以及项 ...

  5. Android安卓——Android程序生命周期

    多处的开发者都给使用者了一个方便,给一些东西设置了一个生命周期的东西.本次学习主要对安卓中程序的生命周期进行讲解. 充分了解安卓生命周期,记住生命周期的优先级,为后续的开发打基础. Android程序 ...

  6. android中应用程序生命周期,Android应用程序生命周期中的活动和图标

    面向大众的移动技术,第3部分 为您的Android移动应用程序添加导航样式 安德鲁·格洛弗 2013年7月25日发布 面向大众的移动技术 请期待本系列的后续内容. 请期待本系列的后续内容. 近年来,移 ...

  7. android生命周期方法,Android零基础入门|Activity状态和生命周期方法

    原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...

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

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

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

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

最新文章

  1. php 空格zhuanyi,php写的将逗号、空格、回车分...-php字符转义的相关注意事项-IIS环境中防止本地用户用fsockopen进行DDOS攻击的方法_169IT.COM...
  2. 八大排序算法的 Python 实现
  3. Cassandra 数据分区
  4. go语言游戏编程初识--`Ebiten`
  5. 在原有的基础之上,启用NAT模型
  6. Python与机器视觉(二)读入图片并显示
  7. ORACLE 树形遍历查询根节点、父节点、子节点
  8. java中visio的作用_Visio软件的概念、用途与特色是什么?
  9. 推荐两个软件下载网站:多特和绿盟
  10. OSChina 周四乱弹 —— 用户体验不好就是要出人命的
  11. 简单几步轻松获取WiFi密码
  12. Activity onDestroy方法未能及时执行原因
  13. ubuntu 18.04 开启rc.local
  14. 嵌入式Linux引导过程之1.4——Xloader的ddr_init
  15. 无线局域网简介 小白级别
  16. 浅谈:网站到底要不要备案?
  17. 主机屋免费空间使用有感
  18. mysql8.0 MySQL函数
  19. 本地html运行网址,如何在本地运行的网页上创建指向本地文件的链接?
  20. 科技达人的想象与「视觉」,曝诈网

热门文章

  1. linux路由内核实现分析(四)---路由缓存机制(3)
  2. Linux netfilter源码分析(6)
  3. SLAM中的marginalization 和 Schur complement
  4. 【重难点】【JUC 05】线程池核心设计与实现、线程池使用了什么设计模式、要你设计的话,如何实现一个线程池
  5. 【LeetCode】剑指 Offer 17. 打印从1到最大的n位数
  6. logstash 使用glusterfs网络存储偶发性文件解析异常的问题
  7. 使用telnet进行Dubbo接口测试
  8. 最小路径和--p64--动态规划
  9. UILabel和NSAttributedString那些事
  10. Linux加固(转)