在多数情况下, 每个Android应用运行在自己的Linux进程中. 当一个应用的某段code需要运行的时候这个进程将会被创建, 直到不再需要该应用或系统要为其他的应用释放内存的时候才停止.
一个非常重要且少有的特性是, 应用进程的存活时间不是由这个应用直接控制的. 而是由系统决定的, 系统会根据每个已知的正在运行的应用情况来定夺, 包括, 该应用对用户的重要性和系统全部可用内存.
对于开发人员来讲, 了解每个应用组件(尤其是, Activity, Service, 和IntentReceiver)对于应用进程存活时间的影响是非常重要的. 如果没有正确使用, 可能会导致应用进程在处理重要工作的时候被系统杀掉.
在对应用进程生命周期的理解中, 一个典型的错误就是当一个IntentReceiver 接收到Intent 之后, 会在自己的onReceiveIntent()方法中开起一个线程, 而后return这个方法. 一旦这个方法return, 系统会认为这个IntentReceiver 不在处于活跃状态, 也就认为他的宿主进程不再需要(除非还包有其他活跃的应用组件). 以至于当系统需要回收内存的时候会随时释kill掉这个进程, 中止其中的子线程. 解决这个问题的办法是在IntentReceiver中启动一个Service, 这样系统会知道在这个进程中还有活跃的任务需要完成.
为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个"重要程度层次". 其重要的程度按以下规则排序:
-
前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.
-
可视进程是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程.
-
服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载 上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的.
-
后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉.
-
空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源.
当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据. 查看Activity, Service,和IntentReceiver的文档, 了解每个组件在进程整个生命周期中的贡献. 每一个classes的文档详细描述他们在各自应用的生命周期中所起得作用.
<!-- end content -->
分享到:
相关推荐
Application 生命周期&全局变量
Application,Session,Cookie,ViewState和Cache生命周期
本文实例讲述了Android activity的生命周期。分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4...
完整英文电子版 IEC 60300-3-3:2017 Dependability management-Part 3-3:Application guide - Life cycle costing(可靠性管理-第3-3部分:应用指南-生命周期成本计算)。IEC 60300-3-3:2017 对生命周期成本的概念...
该控制台组件application-ui与Application生命周期提供的后端组件没有任何直接依赖关系。 相反,它依赖于和来与Application生命周期模型的自定义Kubernetes资源一起使用。 使用模块将applicati
可以在指定进程的指定线程,按指定顺序分发 Application 生命周期方法给初始化类(继承自 SimpleAppInit 并添加 AppInit 注解,低耦合) 可以配置各模块间的初始化顺序,模块内部自己管理各初始化类的顺序,也可配置...
该系列解决方案为端对端的信息生命周期管理, 处理从创建到淘汰的数据生命周期管理的每个阶段。通过Informatica应用程序信息生命周期管理产品系列,您的IT团队可以更好地支持应用程序优化、数据中心和IT整合、IT现代...
第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的...
cis217Application生命周期 应用程序生命周期的演示
实验一Android环境构建与Activity生命周期 【目的】 安装智能手机开发相关软件平台,并在此基础上测试Activity的生命周期过程。 【要求】 1. 完成智能手机开发平台安装、以及相关配置; 2. 并实现Hello World; 3. ...
详解Activity生命周期一、概述1.方法简述2.三种周期二、生命周期中涉及到的其他方法1.onSaveInstanceState() 方法2.onBackPressed()方法三、四条生命线Line 1 onCreate() → onDestroy() 完整生命周期Line 2 onStart...
本文实例分析了Android编程中activity的完整生命周期。分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误。这...
SpringBoot中文注释项目Github地址: ...本篇接 SpringBoot事件监听机制...为广播SpringBoot内置生命周期事件做前期准备:1)首先加载ApplicationListener监听器实现类;2)其次加载SPI扩展类EventPublishingRunListener。
HP Application Lifecycle Management (ALM) 使 IT 能够管理从需求到部署的 核心应用程序生命周期,赋予应用程序团队以可预知、可重复和可适应的方式交 付现代应用程序所需要的关键可见性和协作能力。
android-application-life-cycle 一个Android应用程序,可在其屏幕和logcat中公开其生命周期。
AsyncTask-生命周期Asynctask生命周期此android应用程序描述了在不同情况下异步任务的生命周期。 如果活动被破坏,暂停或应用程序被杀死,当前正在运行的asyncTask会发生什么情况。 还描述了Weak引用和Strong引用在...
☆ 资源说明:☆ [Apress] Visual Studio 2012 应用程序生命周期管理 专业开发 (英文版) [Apress] Pro Application Lifecycle Management with Visual Studio 2012 (E-Book)
AppInit:Android应用初始化框架 AppInit是一款Android应用初始化...功能简介可以在指定进程的指定线程,按指定顺序分配Application生命周期方法给初始化类(继承自SimpleAppInit并添加AppInit注解,低取代)可以配置
文章目录一、智能合约是什么二、智能合约与账本的交互三、chaincode样例四、chaincode生命周期4.1 打包(Package)4.2 安装(Install)4.3 实例化(Instantiate)4.4 运行(Running)4.5 升级(Upgrade)五、System ...