5.1 应用进程模型
Android应用进程模型指的是Android应用运行时,应用进程的分配和调度方式,以及应用组件和进程的关系。Android设计对开发者隐藏了大部分关于应用进程的实现细节,使得在应用开发中不会涉及过多与进程相关的实现细节。但对于开发者而言,只有真正了解Android应用进程的运行模型及其控制方式,才能够自如地驾驭Android应用开发。
5.1.1 应用、组件和进程
Android应用,在实现上就是一个apk文件,其中包含编译过的代码文件、应用资源、数据、配置文件,等等。每个Android应用,都使用包名作为唯一标识,在同一系统中,不能安装两个包名相同的应用。开发者需要在配置文件中设置应用包名的信息,比如,构造名为com.duguhome.test的应用,配置如下:
在根配置项<manifest>中声明应用包名
<manifest package="com.duguhome.test"…>
…
</manifest>
当Android应用运行时,系统会为其分配一个进程,在本书中,称为应用进程。在默认情况下,该应用进程名与该应用的包名保持一致,以此来保证进程命名的唯一性。
在默认配置中,应用中的组件都会在该应用进程的主线程中构造并运行,同时,Android会为每个应用进程构造一个应用环境(Application Context)对象,应用环境对象构造自android.app.Application及其子类。在应用的实现中,可以通过继承的方式来自定义应用环境对象,并且通过配置文件对该环境对象进行声明,例如:
//应用环境对象com.duguhome.test.SimpleApplication的实现
public class SimpleApplication extends Application{
@Override
public void onCreate(){
…#应用启动,可在此处初始化数据
}
@Override
public void onTerminate(){
…#应用结束,可在此处保存数据
}
@Override
public void onLowMemory(){
…#系统内存过低,可以部署一些内存回收策略
}
…
//在配置文件中修改application信息
…
<application android:name="SimpleApplication"
…>
</application>
}
应用环境对象会在应用进程的第一个组件加载之前被构造,直至进程中最后一个组件运行结束后被销毁,它贯穿了整个应用进程的生命周期。因此,应用环境对象为所有运行在该应用进程中的组件提供了全局的功能和数据支持,组件可以通过它获取或缓存全局的数据信息。
如图5-1所示,运行在应用进程中的各个组件对象可以通过Activity.getApplication、Service.getApplication和Context.getApplicationContext等函数,获得所处应用进程的应用环境对象。与Activity、Service类相似,Application类也派生自android.content.Context,可以像界面组件一样和底层服务进行通信[1]。
图 5-1 应用进程和应用运行环境
小贴士 从代码实现来看,Android的应用进程的入口函数是android.app.ActivityThread的main函数,它会利用android.os.Looper对象构造一个消息循环,等待处理相关指令。ActivityThread对象中,保存了所有的组件对象和应用环境对象,是系统控制应用进程和其中组件的桥梁。
[1]关于android.content.Context类的介绍,可以参见第3章的界面组件部分。