(一)Android服务的种类
Android服务主要分为两类,一类是系统服务,它们是由Framework提供的;另一类是应用程序服务提供的,它们是应用程序开发者继承并实现Service类后开发的。
(二)Android应用程序服务
应用程序服务是后台服务程序,它是继承了Android SDK的Service类的类实例,没有UI界面,定期执行某些任务。应用开发者可以通过以下两种方法来使用这些服务。
- 服务的启动和终止:启动和终止执行特定任务的后台服务
- 通过绑定服务,实现远程控制:如同Activity,服务的客户端在绑定到服务之后,通过界面即可利用服务提供的各种功能对服务进行控制
在Android中,服务是应用程序组件,具有一定的生命周期。如图所示,由startService和bindService创建的两种服务,它们呢的生命周期略微不同。由startService创建的服务目的是服务的启动和终止,而bindService创建的服务是为了服务的远程控制。
应用程序服务分为本地服务与远程服务两类,这两类服务的区别在于创建服务的客户端与创建的服务是否运行在同一个进程中。本地服务只能在创建该服务的应用程序内部使用,当应用程序终止时,本地服务也一同终止。而远程服务并不与创建者运行在同一个进程中,它运行在单独的进程中,所以当主应用程序终止时,远程服务仍然会继续运行。还有,本地服务与远程服务最大的不同是,绑定服务时使用的方法不同。在本地服务中,服务与使用服务端的客户端运行在同一个进程中,本地服务的绑定实际是客户端获取了待绑定服务的一个引用。当绑定成功后,客户端即获得了服务的一个引用,通过该引用,客户端即可调用该服务提供的各种方法。就远程服务而言,Activity与远程服务运行在不同的进程中,Activity若是想控制远程服务,必须使用IPC机制。
2.1 本地服务
如图:
具体过程如下:
1. 客户端调用bindService,尝试绑定LocalService;
2. 当待绑定的服务尚未运行,则会先生成Servcice;
3. Android会调用服务的onBind回调方法,返回一个用来Activity和Service链接的Binder对象;
4. 若是Binder对象创建成功,就会调用服务客户端中的onServiceConnected方法,这个方法的参数中保存着onBind生成的Binder对象的引用;
5. Activity拿到这个引用后就可以调用服务的相关方法了。
2.2 远程服务
使用远程服务时,肯定是要定义好客户端和服务端的通信规则。而这个通信规则Android SDK会根据AIDL文件中定义的接口自动生成。
如图:
具体过程如下:
1. 客户端调用bindService,尝试绑定LocalService;
2. 当待绑定的服务尚未运行,则会先生成Servcice;
3. 服务启动后,会一次调用onCreate与onBind方法,onCreate方法会以通知消息的形式告知服务已经生成,onBind方法的主要作用是生成用于处理Binder IPC的Binder对象。这个Binder对象是由xxx.Stub类生成的。
4. 若是Binder对象创建成功,就会调用服务客户端中的onServiceConnected方法,这个方法的参数中保存着onBind生成的Binder对象的引用,而后将其传递给xxx.Stub.asInterface函数,并使它生成与RemoteService服务绑定的在一起的服务代理对象xxx.Stub.Proxy,最后将其保存到成员变量中;
5. Activity就可以使用这个服务代理对象,调用RemoteService中的方法;
6. 服务代理对象xxx.Stub.Proxy向服务绑定对象xxx.Stub传递IPC数据;
(三)Android系统服务
3.1 系统服务分类
系统服务分为本地系统服务和Java系统服务。本地系统服务是C++编写的,运行在Libraries层中,主要包含AudioFlinger【混合多种Android应用程序的音频数据并发送到耳机、扬声器等音频输出设备中】、Surface flinger【将各种应用程序的Surface组合后渲染到Frame Buffer设备中】等。java系统服务由SystemServer系统进程启动,分为
- 核心平台服务:核心平台服务不会直接与Android应用程序进行交互,但它们是Android Framework运行所必需的服务。
- 硬件服务:该服务提供了一系列API用云控制底层硬件。
无论在Framework内部,还是Android应用程序中,若是想是使用java系统服务,必须使用能够与之通信的xxxManager对象。
3.2 Android启动系统服务
在Android启动时,系统服务具体由媒体服务器【MediaServer】和系统服务器【System Server】两个系统进程运行。媒体服务器是用来启动除Surface Flinger之外的本地服务,而系统服务器是Zygote最初生成的基于java的进程,它会启动所有java系统服务。
Android启动系统服务的过程如图所示:
3.3 MediaServer运行系统服务
MediaServer是个系统进程,由init进程启动运行,在init.rc脚本文件中可以看到相关脚本,如下所示:
service media /system/bin/meidaserver
user media
group system audio camera graphics inet_bt net_bt_admin
MediaServer的功能非常简单,负责生成各个服务的对象,并将生成的服务注册到Context Manager中,过程如下:
3.4 SystemServer运行系统服务
SystemServer是由Zygote进程最初生成,运行在Dalvik虚拟机中的java进程,它用来运行多种java系统服务和Surface Flinger本地系统服务。过程如下图所示: