007 Android应用程序的进程生命周期

原创 2016年06月02日 11:44:16

本章节要弄懂的问题:

1. Android应用程序的进程的5个等级?

2. Android应用程序是如何启动和销亡?

3. Application的生命周期有哪些?

 

前言

Android系统基于Linux内核,是一个多用户的操作系统:Android系统为每一个启动的Android应用程序创建一个临时用户,并且为每一个临时用户创建一个用户进程,这些临时用户是没有Root权限的。

 

Android应用程序的进程的5个等级

Android应用程序的进程有5个等级,如图007-01所示。


图 007-01

 

Android应用程序的进程等级由高到低分别是:Active Process(前台活动进程)、Visible Process(可见进程)、Started Service Process(服务进程)、Background Process(后台进程)、Empty Process(空进程)。

1. Active Process,当前应用程序正处于前台活动状态,必须是Activity处于Resume状态,或正处于与bound服务交互的状态,或服务正在前台运行的状态,或者服务的生命周期函数正在被执行的状态、BroadcastReceiver正在执行onReceive()方法等等。简单地说,Activity正在与用户发生直接的交互状态(或说,正处于焦点状态),那么该应用程序的进程就是Active状态。

2. Visible Process,当前应用程序不是焦点状态,Activity不在前端显示,但也没有完全被隐藏,而是部分可见的状态,这个时候的应用程序的进程是Visible状态。例如当一个应用程序正在运行时,突然被一个其它应用程序弹出的一个对话框给遮挡住,这时,这个被遮挡的应用程序进程就是处于Visible状态。

3. Started Service Process,应用程序的进程正在运行,但不处于ActiveVisible两种状态的服务。例如,一个使用Service进行音乐播放,但是没有Activity处于运行状态的应用程序,此时该应用程序的进程就是Started Service状态。

4. Background Process,没有任何ActivityService在运行的应用程序,此时系统会持有该应用程序的进程,如果该应用程序长时间处于该状态,那么当系统内存资源不足时,系统就会有可能杀死该应用程序的进程,而从释放该应用程序所占的内存资源。另外,当该程序还未被杀死,而该程序重新被运行时,那么系统就会直接复用该程序的进程和资源,从而加快应用程序的启动速度。

5. Empty Process,没有任何Android组件在运行的程序,与Background Process的情况极其类似,但是系统会优先杀死处于Empty状态的应用程序的进程。


Android应用程序的进程启动

Android应用程序是依靠PackageManager来启动的:当点击一个应用程序的图标后,PackageManager首先会在系统的进程列表中查找是否有应用程序的进程(应用程序的进程的名称是该应用程序的包名),如果有,则直接复用这个进程;如果没有,则通知系统的Zygote守护进程,然后Zygote会启动一个新的Dalvik VM实例来运行该应用程序,这个新Dalvik VM实例是运行在一个新的临时用户的用户进程中。


Android应用程序的进程销亡

是应用程序主动申请销亡或者第三方进程管理程序主动销亡该应用程序。

下面以HelloWorld应用程序为例子,进行应用程序主动申请销亡的演示说明。

 

Android设备上运行HelloWorld程序,然后再PC上启动ADB shell,如图007-02所示。


图 007-02

 

注意:

ADB工具位于SDK安装目录下的platform-tools目录下,需要将该路径追加到系统环境变量中的Path变量中。

 

shell中使用ps命令查看当前所有正在运行的Android应用程序的进程,找到com.androidDemos.helloWorld程序的进程,如图007-03所示。


图 007-03

 

此时,可以看到正在运行的HelloWorld程序的进程ID7676,然后点击返回键退出HelloWorld程序,然后在shell中执行ps命令,结果HelloWorld程序的进程还在。这表明,使用默认的退出结束操作虽然退出了HelloWorld应用程序,但是HelloWorld应用程序的进程并没有退出。

现在我们在HelloWorld程序中的MainActivity.java中添加入图007-04所示代码。


图 007-04

 

这时候运行修改后的HelloWorld程序,然后按返回键退出程序,然后在shell中运行ps命令,在列出的所有进程信息中就找不到com.androidDemos.helloworld的进程了,因为使用System.exit(0)或者Process.killProcess(Process.myPid)方法就能强制退出当前应用程序的进程。


Application的生命周期

Android应用程序有且只有一个Application子类,Application伴随着Android应用程序的进程的启动和销亡。一般来说,我们无需自己实现一个Application子类,而使用系统默认提供的Application子类就行。因为如果经验不足的话,容易导致内存泄露等一系列问题。

下面我们就在HelloWorld工程中实现一个Application子类为例,演示Application的生命周期。

 

我们新建一个名为HelloWorldApplicationApplication子类,并添加如图007-05所示的代码。


图 007-05

 

Application中有5个基本的生命周期函数:

1. onCreateApplication第一次被创建时会被调用。

2. onConfigurationChanged在应用程序运行时,手机屏幕转到方向或者其它配置发生变化时会被调用。

3. onLowMemory在应用程序在应用程序进程处于Background或者Empty时会被调用。

4. onTrimMemory在应用程序进程处于Background或者Empty时会被调用,这个函数是在Android 4.0才增加的,在4.0及以上版本系统上运行的程序才会被调用。

5. onTerminate在应用程序进程被系统自动回收销毁时会被调用。

 

AndroidManifest文件中注册HelloWorldApplication.java类,这样就能让HelloWorld应用程序使用我们自定义的HelloWorldApplication组件了,如图007-06所示。


图 007-06

 

MainActivity.javaonBackPressed方法修改成如图007-07所示。


图 007-07

 

运行程序,观察LogCat中的log信息,就会看到当进程启动时,Application也会跟着启动,并且调用了onCreate方法,如图007-08所示。


图 007-08

 

按返回键或者Home键,就会发现会触发ApplicationonTrimMemory方法。再接着重新启动HelloWorld,发现onCreate方法并没有被调用,这证明了如果系统没有杀死应用程序的进程的话,就会复用该进程,而不是再去创建一个新的进程。如图007-09所示。


图 007-09


HelloWorld正在运行,此时如果你旋转屏幕方向,就会发现此时会触发ApplicationonConfigurationChanged方法,如图007-10所示。


图 007-10

 

如果你使用系统提供的内存管理软件杀死了HelloWorld程序,就会发现onTerminate方法并没有在LogCat中显示,这是因为这些主动管理内存的软件都是调用Process.killProcess()方法,导致了应用程序的进程被强制结束,故而追踪不到onTerminate方法是否被调用。如果在MainActivity.java中的onBackPressed方法使用System.exit(0)Process.killProcess(Process.myPid())方法,那么则是一样的处理流程。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android应用程序的生命周期

描述:程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android从启动到停止的全过程。==程序的生命周期是由Android系统进行调度和控制的。 ① 程序生命周期 ...
  • G1036583997
  • G1036583997
  • 2014年03月07日 14:48
  • 8156

Android 应用程序生命周期

今天突然就bu'xia啊,接下来了解下Service
  • zqingyang521
  • zqingyang521
  • 2014年10月29日 13:56
  • 464

Android的进程与生命周期

 转载自:http://blog.csdn.net/codezjx/article/details/8854507 一、Android的进程与生命周期: Android系统会尽可能长的延续一...
  • qq_21727627
  • qq_21727627
  • 2017年01月04日 15:45
  • 128

进程生命周期与状态转换

http://www.cnblogs.com/qianye/archive/2012/11/25/2788330.html 进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变...
  • OnafioO
  • OnafioO
  • 2016年03月28日 14:09
  • 2115

关于进程、线程生命周期的总结

在操作系统里,有进程的运行状态与线程的运行状态; 进程的三种基本状态 实际系统中,为了管理的需要,还存在着另外两种状态:创建状态和终止状态。 进程的五种基本状态...
  • amosilin
  • amosilin
  • 2016年04月06日 23:08
  • 967

Android应用程序进程启动过程(前篇)

在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应...
  • itachi85
  • itachi85
  • 2017年03月20日 11:06
  • 2930

No1.线程与进程的区别,一个线程的完成的生命周期。

简单的说,进程是一个容器。比如一间漂亮的小别墅。别墅里有厨房、书房、洗手间等。当然,还有一家三口住在里面,当妈妈带女儿外出游玩时,爸爸一个人在家。这时爸爸一个人在家里爱上哪里去哪里,爱干嘛干嘛,这时,...
  • shasiqq
  • shasiqq
  • 2016年12月21日 15:18
  • 483

android application生命周期介绍

看到application这个类,一直不知道这个是干什么用的,今天刚好有点时间,所以进行了详细的学习。 一.先对它的整体概念解释: 在android源码中对他的描述是;         * ...
  • u011467537
  • u011467537
  • 2015年01月21日 10:00
  • 3126

Application生命周期及Process进程

当application在Linux平台开启时,系统会给这个application创建一个进程(progress)来运行同时分配内存资源给该application,当程序结束运行时,该进程结束系统回收...
  • qq_37679744
  • qq_37679744
  • 2017年05月05日 17:15
  • 476

程序员的故事 007 程序员是吃青春饭的

007 程序员是吃青春饭的     这天中午吃饭时照例闲聊,小眼镜听到了一个让他心惊肉跳的说法:程序员是吃青春饭的。     他想,这程序员的饭我还没能吃上呢。刚刚在公司里做测试工作,背地里悄...
  • gcfang123
  • gcfang123
  • 2016年02月27日 22:40
  • 460
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:007 Android应用程序的进程生命周期
举报原因:
原因补充:

(最多只允许输入30个字)