关闭

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

269人阅读 评论(0) 收藏 举报
分类:

本章节要弄懂的问题:

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())方法,那么则是一样的处理流程。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2529次
    • 积分:131
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条