Java代码可以通过JNI方法来调用C/C++代码, 因此,Andrnid系统在应用程序框架层中提供了Binder进程间通信机制的Java接口, 它们通过JNI方法来调用Binde库的C/C++接口, 从而提供了执行Binder进程间通信的能力。
Binder进程间通信机制的Java接口:
1、Service Manager的Java代理对象的获取过程2、Java服务接口的定义和解析
3、Java服务的启动过程
4、Java服务代理对象的获取过程
5、Java服务的调用过程
1、ServiceManager的Java代理对象的获取过程。
在Java层中,ServiceManager的Java代理对象的类型为ServiceManagerProxy ,它实现了IServiceManager接口。
IServiceManager接口继承了IInterface接口,并且定义了四个成员函数:getService、checkService、addService和listService,其中,getService和checkService用来获取Java服务的代理对象,addService用来注册Java服务,listService用来获取注册在ServiceManager中的Java服务名称列表。
ServiceManager的Java代理对象的内部有一个成员变量mRemote,类型为IBinder,实际上指的是一个BinderProxy对象。
2、Java服务接口的定义和解析
在实现自己的Java服务之前,首先要定义这个 Java服务要实现的接口 ,即定义自己的Java服务接口,在Android应用程序中,我们可以通过Android接口描述语言( Android Interface Definition Language , AIDL )来定义Java服务接口。AIDL是一种Binder进程间通信接口的描述语言,通过它来定义的Java服务接口具有执行Binder进程间通信的能力
以AIDL定义的Java服务接口保存在一个以”aidl“为后缀名的文件中,在编译时,它们会被转化为使用Java语言来描述的Java服务接口
3、Java服务的启动过程
Java服务一般是运行在Android系统进程System或者Android应用程序进程中的,它们在启动之前,同样需要将自己注册到ServiceManager中, 以便Client进程可以通过ServiceManager来获得它们的Java服务代理对象。
由于Android系统进程System和Android应用程序进程在启动时会在内部启动一个Binder线程池,因此,运行在它们里面的Java服务在启动时 ,只需要调用ServiceManager类的静态成员函数addService将其注册到ServiceManager中就可以了。
示例:
ClassServerThread extends Thread{
¨¨¨
Publicvoid run(){
¨¨¨
try{
Slog.i(TAG,"Audio Service");
ServiceManager.addService(Context.AUDIO_SERVICE,new AudioService(context));
}catch (Throwable e) {
Slog.e(TAG,"Failure starting Audio Service", e);
}
¨¨¨
}
}
4、Java服务代理对象的获取过程
Java服务注册到ServiceManager中之后,Android应用程序就可以通过ServiceManager来获得他的一个Java服务代理对象了。
示例:
publicclass AudioManager {
privatestatic IAudioService sService;
privatestatic IAudioService getService()
{
if(sService != null) {
returnsService;
}
IBinderb = ServiceManager.getService(Context.AUDIO_SERVICE);
sService= IAudioService.Stub.asInterface(b);
returnsService;
}
}
通过ServiceManager类的静态成员函数getService来获得名称为Context.AUDIO_SERVICE的Java服务代理对象,接着再通过IAudioService.Stub.asInterface将这个服务代理对象封装成一个实现了IAudioService接口的Java服务代理对象。
5、Java服务的调用过程
Android 应用程序获得了一个Java服务代理对象之后 ,就可以通过Binder进程间通信机制使用这个 Java服务了