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的前期 ...
随机推荐
- C#_ 项目打包附加数据库
C#_ 项目打包附加数据库 2010-07-11 23:22:45| 分类: Winfrom|举报|字号 订阅 实现效果:安装项目时直接附加数据库. 1.首先在需要部 署的项目的解决方案资源 ...
- 基于VMware为CentOS 6.5配置两个网卡
为CentOS 6.5配置两块网卡,一块是eth0,一块是eth1,下面以master为例 1.选择“master”-->“编辑虚拟机设置”,如下所示 2.单击“添加”,如下 3.选择“网络适配 ...
- hdu2007
import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...
- XC一键锁屏应用
XC一键锁屏,一键Android锁屏应用,彻底解放开关机键~ 下载地址: http://download.csdn.net/detail/jczmdeveloper/7329447
- iOS监听电话事件
项目上有个需求,要求打完电话后加积分. 首先导入这两个头文件: #import <CoreTelephony/CTCallCenter.h> #import <CoreTelepho ...
- 经常使用的两个清爽的table样式
两个我经常使用的table样式: <html> <head> <title></title> <style type="text/css ...
- 插件使用总结-jquery.pin.js
小伙伴们,俺昨天用了jquery.pin.js这个插件,发现了一些自以为是的使用问题.特此做个总结哈. 1.获取: 下载地址: http://www.bootcss.com/p/jquery.pin ...
- 消除热块(hot block)
上篇日志提到了,那么高的负载,是存在数据块读竞争,下面介绍几个方法来消除块竟争 查找块竟争 SELECT p1 "file#", p2 "block#", p3 ...
- free() 是如何释放不同内存区块大小的指针?
最初是在知乎上看到这个问题的C++ delete[] 是如何知道数组大小的?,我也挺好奇,所以就作了一番工作. 申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围看下面这段代码: #i ...
- Codeforces 551D GukiZ and Binary Operations(矩阵快速幂)
Problem D. GukiZ and Binary Operations Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的 ...