Android8.0.0-r4——Binder进程间通信机制的Java接口

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服务了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值