在Android Framework或应用开发主要API都是以系统服务的形式存在的。像读感应器的值、获取终端的位置,都是在Framework中以服务的形式存在的。
Android服务的种类
Android 应用程序服务
Android应用程序服务都是Android的一种应用程序组件。
开发者可以通过以下两种方法来使用这些服务:
1. 服务的启动和终止;
2. 通过服务绑定,实现远程控制。
当 Media Player 中播放音乐时,后台的音乐服务就会启动,音乐就会继续播放下去;
而需要对音乐进行播放、暂停、后退时,就需要连接到正在运行的音乐服务就可以,这一过程被称为服务的绑定,被绑定后的服务就可以自由调用服务的各个方法,如RPC。
Android RPC原理
原理:
1. RPC以接口形式实现;
2. 原理来自代理模式和RMI结构;
3. 被请求端的接口类以一个Service为代理,在客户端绑定Service过程中返回远程对象。
目的:
在不同的应用进程间,一个进程调用另一个进程中的对象。
应用步骤:
1. 定义一个后缀为 .aidl 的接口文件,ADT工具会自动生成对应的Java接口类并且该接口类中有个Stub内部抽象类。
2. 定义上述接口的实现类。
3. 用一个Service作为代理,在它的 onBind() 方法中返回一个接口实例对象。
4. 客户端对绑定这个代理角色Service,同时获得返回的接口实例对象,进而使用该对象。
逻辑图:
1. 上图中Service作为接口实例对象的代理,在绑定该服务时,返回接口实例对象,供客户端操作。
2. 用户定义的接口时先定义后缀为 .aidl 的接口,然后由工具自动生成的该接口文件(该文件用户不可修改)。
3. 接口实现类一般直接继承Stub这个内部抽象类。
4. 虽然客户端与Service分别处于不同的进程中,但客户端通过远程Service来获取其他进程中的实例。
应用程序服务-本地服务
Activity与它所创建的本地服务都在同一进程中,当应用程序终止时,本地服务也随之停止。
1. 调用bindService(),尝试绑定LocalService。
2. 在待绑定的服务生成之后,Android会调用服务的onBind()回调方法,用来处理服务绑定;
调用onBind()方法将返回LocalBinder对象,继承自Binder类,Activity使用该对象与LocalService对象。
3. 前两步进行顺利的话,处理服务绑定的对象创建成功,Android Framework就会调用服务客户端的onServiceConnected(ComponentName,IBinder)方法,该方法的第二个参数保存着步骤(2)中onBinder()生成的LocalBinder对象的引用。
LocalBinder继承自Binder类,而Binder类又实现了IBinder接口,所以第二个参数IBinder Service可以接收LocalBinder对象。
4. 保存LocalService对象的引用到Activity的getService成员中,本地服务绑定完成。
应用程序服务-远程服务
就远程服务而言,Activity与远程服务运行在不同的进程中,Activity若想控制远程服务,就必须使用IPC机制。
1. BindingActivity:请求RemoteService连接。
Activity必须先调用binService(),绑定到远程服务上,才能实现对服务的远程控制。
bindService()的第一个参数是Intent,用来运行远程服务,而在RemoteService的manifest中,可看到服务处理的动作。
2. Remote服务:具体实现服务方法,并提供用于通信的Binder对象。
服务启动后,依次调用onCreate()和onBind()方法,onBind()方法的主要作用是生成用于处理Binder IPC的Binder对象,并将其返回给系统。
3. BindingActivity:生成执行服务与Binder IPC的代理对象。
当(1)中的请求服务生成之后,将调用回调方法onBind(),返回Binder对象,Android Framework调用回调方法onServiceConnected(),它的第二个IBinder类型的参数接收Binder对象,而后将其传递给ISecondary.Stub.as.Interface()函数,并使用它生成与RemoteService服务绑定在一起的服务代理对象ISecondary.Stub.Proxy,最后将其保存到mSecondaryService成员变量中。
至此,RemoteService的ISecondary接口的绑定就完成了。Activity可以通过保存在mSecondaryService成员变量中的服务代理对象,调用RemoteService的方法就像使用自己的方法一样。
4. BindingActivity:使用服务代理对象,调用RemoteService服务的代理方法。
5. Binder IPC:服务代理对象(ISecondary.Stub.Proxy)向服务Binder对象(ISecondary.Stub)传递Binder IPC数据。
6. RemoteService服务:调用RemoteService服务的Stub方法。ISecondary.Stub服务Binder对象获取Binder IPC数据后,会调用(2)实现的getPid()Stub方法。
Android 系统服务
Android系统服务提供系统最基本、最核心的功能,如设备控制、位置信息、通知信息等,这些服务分别存在Android Framework 与 Library层之中。
Android Framework:核心平台服务和硬件服务。
Library:本地系统服务。
系统服务 - 本地系统服务
本地系统服务使用C++编写,运行在Library层,主要包含Audio Flinger、Surface Flinger等。
Audio Flinger
AudioFlinger服务混合多种Android应用程序的音频数据,并发送到耳机,扬声器等音频输出设备中。在Android设备中,所有音频数据均由Audio Flinger进行输出。
Surface Flinger
Surface Flinger是Android Multimedia的一部分,它是一个服务,提供系统服务范围内的Surface composer功能,将各种应用程序的Surface组合后渲染到Frame Buffer设备中。
系统服务 - Java系统服务
在Android启动时,Java系统服务由SystemServer系统进程启动,分为核心平台服务和硬件服务。
1. 核心平台服务(Core Platform Service)
ActivityManagerService:管理所有Activity的生命周期与堆栈。
WindowMangerService:位于Surface Flinger之上,将要绘制到机器画面上的内容传递给Surface Flinger。
PackageManagerService:加载apk(Android包文件)信息,提供信息显示系统中设置了哪些包,以及加载了哪种包。
2. 硬件服务(Hardware Service)
AlarmManagerService:在特定时间后运行指定应用程序,就像定时器。
ConnectivityService:提供有关网络当前状态的信息。
LocationService:提供终端当前的位置信息。
PowerService:设备电源管理。
SensorService:提供Android中各种传感器的感应值。
TelephonyService:提供话机状态及电话服务。
WifiService:控制无线网络连接,如AP搜索,连接列表管理。
如何使用Java系统服务呢?
APP若想使用LocationService,需先调用getSystemService()函数创建与LocationService相应的LocalManager对象,而后应用程序使用生成的LocalManager对象,调用LocationService提供的各种函数,执行相应的功能。