在多数情况下, 每个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 生命周期&全局变量
ASP.NET生命周期是Web应用程序开发中的核心概念,它涵盖了从客户端浏览器发起请求到服务器响应的整个过程。这个生命周期涉及多个阶段,对于理解和优化ASP.NET应用程序的性能至关重要。 首先,当一个HTTP请求到达Web...
Oracle的生命周期政策确保了客户在每个产品的整个生命周期内都能获得必要的技术支持和服务,同时鼓励他们随着时间的推移升级到更先进的版本,以利用最新的技术和安全增强。这种策略不仅有助于维持系统的稳定性和安全...
在Apple的iOS应用开发中,程序的生命周期是开发者必须要深入理解的关键概念。程序生命周期涉及到从应用程序启动、运行、暂停、后台处理、恢复直至关闭的全过程。对于iPhone开发来说,掌握这个生命周期有助于编写更加...
完整英文电子版 IEC 60300-3-3:2017 Dependability management-Part 3-3:Application guide - Life cycle costing(可靠性管理-第3-3部分:应用指南-生命周期成本计算)。IEC 60300-3-3:2017 对生命周期成本的概念...
Application,Session,Cookie,ViewState和Cache生命周期
本文实例讲述了Android activity的生命周期。分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4...
### ASP 生命周期详解 #### ASP 生命周期概述 在理解ASP(Active Server Pages)的生命周期之前,我们需要先了解几个关键概念。ASP是一种服务器端脚本环境,在HTML页面中嵌入服务器端脚本,用来创建动态网页。ASP...
- 组件的生命周期与壳App的application生命周期绑定,确保正确管理组件的加载和卸载。 6. **集成调试**: - 通过控制组件的isModule标志来选择性地编译和调试组件,提高开发效率。 - 组件开发完成后,设置is...
### iPhone程序的生命周期分析 #### 一、引言 在iPhone开发中,了解应用程序的生命周期至关重要。这不仅有助于开发者更好地管理资源,还能确保应用能够顺畅地响应用户操作和系统事件。本文将深入探讨iOS程序从启动...
该控制台组件application-ui与Application生命周期提供的后端组件没有任何直接依赖关系。 相反,它依赖于和来与Application生命周期模型的自定义Kubernetes资源一起使用。 使用模块将applicati
Service生命周期的理解和正确管理对于优化应用程序性能至关重要。以下是一个关于Service生命周期的详细解析,结合代码示例来阐述如何在Android中操作Service。 1. **Service生命周期概述** Service的生命周期主要...
### WPF生命周期详解 在深入学习Windows Presentation Foundation(WPF)之前,理解其生命周期是非常重要的。这有助于我们更好地掌握WPF应用程序的工作原理及其内部机制。本文将详细介绍WPF应用程序的生命周期,...
7. Global.asax全局应用程序类:理解Session生命周期和Application生命周期事件,如Session_OnStart、Session_OnEnd、Application_OnStart和Application_OnEnd。 8. Ajax应用:引入ScriptManager、UpdatePanel和...
《cis217Application生命周期:深入理解应用程序的生与死》 在计算机科学领域,应用程序生命周期(Application Lifecycle)是每一个软件开发人员必须熟知的关键概念。它涵盖了从软件构思、设计、编码、测试、部署到...
“Application生命周期及Activity生命周期”是Android开发的重点。Application类代表整个应用实例,其生命周期贯穿应用的始终。而Activity作为用户界面的基本单元,有其独特的生命周期,包括onCreate()、onStart()、...
Executor 在整个 Application 生命周期内保持活跃,即使没有 Job 运行,这样可以实现快速的任务启动和内存计算。 Hadoop 的 MapReduce 模型在处理迭代计算时效率较低,因为它频繁地读写 HDFS,导致大量 I/O 操作。...
可以在指定进程的指定线程,按指定顺序分发 Application 生命周期方法给初始化类(继承自 SimpleAppInit 并添加 AppInit 注解,低耦合) 可以配置各模块间的初始化顺序,模块内部自己管理各初始化类的顺序,也可配置...
### ASP.NET页面生命周期详解 #### 一、引言 ASP.NET是Microsoft提供的一个强大的Web开发框架,它使得开发者能够高效地构建动态Web应用程序。在深入理解ASP.NET开发的过程中,掌握页面生命周期是至关重要的一步。...
在global.asax.cs文件中,利用Application生命周期事件(Application_Start、Session_Start、Session_End)来管理和更新在线人数。每当新会话开始时,增加在线人数计数;会话结束时,减少计数。这种方法为整个应用...