Android应用程序的生命周期
在对一个简单的Hello World工程进行项目结构剖析后,我们接着来学习下一个Android应用程序的生命周期是怎么样的,以便为后面的开发有个垫下良好的基石~
所谓的应用程序生命周期无非就是应用程序进程从创建到消亡的整个过程。但是,之所有将这一点拎出来单独的讲,当然有其特殊性。的确,Android应用程序的生命周期的终结这个动作并非由应用程序进程本身执行,而是取决于Android系统,也就是Android应用程序生死由“天”,不能主宰自己的命运。这与我们传统的编程思维可能有所不同,如最初学的C语言程序都是最后收到内部或者外部退出请求而运行中的进程从main函数通过return退出,而非由系统直接kill的,这样的情况很少。那么,Android的设计师们为什么如此设计呢?这样设计的好处是什么呢?
其实,主流智能手机大多数都是多任务型,笔者常常用自己的手机一边游戏一边听音乐同时可能还开着UCWeb和QQ,的确这样给用户带来的体验是无以伦比的。但是,一个不容忽视的问题就是,手机的内存只有那么多,随着我们打开的应用程序数量的增多,随之而来的可能会是应用程序响应时间过长或者系统假死的糟糕情况。所以,若将Android应用程序生命周期便交由系统处理的话,那么在系统内存不足的情况下,便由Android系统舍车保帅,选择性的来终止一些重要性较次的应用程序,以便回收内存供更重要的应用程序使用。
那么,系统是根据一个怎样的重要性标准来中止Android应用程序的呢?其实,Android中根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分成五个,如下图所示:

前台进程
顾名思义,前台进程就是在屏幕最前端显示并和用户交互的Activity进程或者该进程的一个BroadcastReceiver正在运行。这样的进程重要性最高,在系统中也只有少数这样的进程。除非在系统内存非常低,万不得已的情况下才会被中止,否则系统不会选择中止前台进程。
一般而言,满足以下条件之一即可视为前台进程
1)进程正在最前端运行一个和用户交互的Activity(其OnResume()方法将被调用)
2)进程有一个正在运行的BroadcastReceiver(它的BroadcastRecevicer.onReceive()方法正在被执行)
3)进程有一个Service,并且在Service的某个回调函数内正有执行的代码
可见进程
可见进程是指那些对于用户可见,但是不显示在屏幕的最前端的进程。可见进程的重要程度也是很高的,通常不会被系统所中止,除非处于舍车保帅的情况, 为了保持所有的前台进程的正常运行而不得不中止可见进程。
一般而言,满足以下条件之一即可视为可见进程
1)有一个非前台但是仍然对用户可见的activity(onPause()方法被调用)。例如:当前的前台的activity是一个对话框,上一个activity还是可见的
2)具有一个绑定到可见activity的service
服务进程
服务进程是拥有Service的进程,该Service是有startService()方法启动的,这些进程通常运行在后台,并且对用户是不可见的。但是,这些进程所作的工作却也是比较重要的,如在后台进行播放音乐的工作。所以,除非在保证前两种高级别的进程能正常工作的情况下,否则系统一般不会中止服务进程的。
后台进程
后台进程运行着对用户不可见的activity(调用过onStop()方法),这些进程对用户体验没有直接的影响,可以在上述进程需要内存资源的时候,从后台进程这回收。通常,系统中有很多的不可见的进程在运行,这些都保存在LRU(least last used)列表中,以便内存不足的时候会在第一时间被回收。当需要中止进程的时候,系统会保证最近一个被用户看到的进程最后一个被中止。
空进程
在空进程中无任何的应用程序组件,而这种进程存在的唯一理由是提供一种缓存机制,使得缩短应用程序下次启动所需的时间。系统会经常的中止空进程,从而达到调节程序缓存和系统缓存的平衡。
Android应用程序的生命周期的更多相关文章
- Android中级教程之Android应用程序的生命周期
Android应用程序的生命周期图 在大部分情况下,每个Android应用都将运行在自己的Linux进程中.当这个应用的某些代码需要执行时,进程就会被创建,并且将保持运行,直到该进程不再需要,而系统需 ...
- Android 4学习(5):概述 - Android应用程序的生命周期
参考:<Professional Android 4 Application Development> Android应用程序生命周期 Android应用程序无法控制自己的生命周期,因此它 ...
- Android四大组件的生命周期
介绍生命周期之前,先提一下任务的概念 任务其实就是activity 的栈它由一个或多个Activity组成的共同完成一个完整的用户体验, 换句话说任务就是” 应用程序” (可以是一个也可以是多个,比如 ...
- Android-管理Activity生命周期 -停止和重启Activity
停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- Android-管理Activity生命周期 -开始一个Activity
很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...
- 教你理解微信小程序的生命周期和运行原理
转自:http://blog.csdn.net/tsr106/article/details/53052879 写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君 ...
- 理解微信小程序的生命周期和运行原理
写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...
- Android横竖屏切换生命周期
转自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题.android的前期 ...
随机推荐
- MapReduce中的map个数
在map阶段读取数据前,FileInputFormat会将输入文件分割成split.split的个数决定了map的个数.影响map个数(split个数)的主要因素有: 1) 文件的大小.当块(dfs. ...
- SourceTree - 好用的 Git / Mercurial GUI 管理工具 for Mac OS X
Git 是免費.開放源碼的分散式版本控制系統,從小專案到非常大的專案,都可以很快速.有效地管理. 對程式設計師來說,一定要熟記 git 指令的用法,在終端機下操作 git 是必備的基本技能.(其他的 ...
- android开发之Parcelable使用详解
想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...
- winows 进程通信的实例详解
发送端: 新建一个基本对话框工程,添加6个文本框控件,并且关联控件变量(CString类型): m_strCopyData, m_strFileMap, m_strMem, m_strRegMsg, ...
- SetUID、SetGID中的大小写Ss和Sticky bit中的大小写Tt
大写:原文件/目录没有执行(x)权限 小写:原文件/目录有执行(x)权限 例如: 原文件:-rwxr-xr-x 增加SetUID后 4755 变为:-rwsr-xr-x 再如: 原文件:-rwxr-- ...
- Mysql解压版的安装
Mysql解压版的安装 ——@梁WP 1.解压mysql到合适的地方 2.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,修改下面的系统变量 3.新建MYSQL_HOME变量, ...
- linux根下目录详解及分区建议
/ 根目录 分区大小一定要充足,一般不小于5GB/bin,/usr/bin 普通用户使用命令 建议和/放一起/sbin,/usr/sbin 管理员使用命令/bin,/sbin 操作系统自身 ...
- c# 格式化百分比
代码示例: <%#Eval("total").ToString() == "0" ? "00.00%" : (Convert.ToDe ...
- 24、Javascript BOM
BOM(Browser Object Model)浏览器对象模型,一组浏览器提供的API. window对象 window对象表示当前浏览器的窗口,是Javascript的顶级对象,所有创建的对象.函 ...
- CSS常见问题及兼容性
CSS常见问题 1 (IE6,7)H5标签兼容 解决方法1:(只显示核心代码) 1<script> ; ; ; ;;;};;;;;;;; ...