Android Framework或应用程序中所需要的主要API都是以系统服务的形式提供的。
例如获取终端的当前位置,读取感应器的数值,拨打电话等。
一、Android服务的种类
Android系统中有两类服务
一类是系统服务,由Framework提供
另一类是应用程序服务,应用程序开发者继承并实现Service类开发出来的
图
二、Android应用程序服务
应用程序服务是Android四大组件的一种, 通过继承Android SDK的Service类实现
可以通过以下两种方式使用这些服务
<1> startService
只是想着后台启动一个执行特定任务的服务
<2>bindService
想通过服务提供的界面实现对服务的控制
三、应用程序服务的分类
应用程序服务分为
Local Service
创建服务的客户端与服务在同一进程,本地服务只能在创建该服务的应用程序内部使用,
当应用程序终止时,本地服务也一同终止,不论使用哪种方法启动的服务(startService或者bindService)
Remote Service
创建服务的客户端与服务不在同一个进程,客户端要使用服务必须通过IPC机制。
AIDL用于约束两个进程间的通信规则,共编译器生成代码。用来实现Android设备上两个进程间的IPC。
远程服务需要在
1. 本地服务Local Service
图
通过Binder getService获取本地服务LocalService的引用。
2. 远程服务RemoteService
图
ISecondary.aidl -> 编译器生成ISecondary.java
解析
服务端需要继承ISecondary.stub并实现getPid()
ISecondary.Stub.onTransact(){
...
case TRANSACTION_getPid:
...
int _result = this.getPid(); //由继承stub的服务子类实现功能
reply.writeInt(_result);
...
...
}
客户端使用ISecondary.Proxy通过这个代理完成与服务端的通信
private static class Proxy implements com.example.android.apis.app.ISecondary{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote){
mRemote = remote;//mRemote 保存了引用远程服务的Binder
}
public android.os.IBinder asBinder(){
return mRemote;
}
public int getPid{
...
mRemote.transact(Stub.TRANSACTION_getPid, _data, _reply, 0);
...
}
}
四、Android系统服务
图
1. 系统服务分类
本地系统服务 使用C++编写,运行在Libraries层,主要是AudioFlinger, SerfaceFlinger
JAVA系统服务 如ActivityManagerService LocationService, 想要使用JAVA系统服务必须使用能够与各服务通信的Local Manager对象。
五、运行系统服务
1. Android系统启动时,init进程已经启动了这些系统服务,使用系统服务时不需要启动它, 直接调用getSystemService使用即可。
2. 系统服务由MediaServer, SystemServer两个系统进程运行。
图
3. MediaServer的运行过程
图
4. SystemServer的运行过程
图
六、Android Service Framework, Binder Driver概要及相关术语
图