Android AIDL 实现机制浅析

  次阅读 来源:互联网(转载协议) 2016-01-14 12:35 我要评论(0)

1.基于前面写的aidl使用,这段时间准备研究ActivityManager框架,对aidl进行了更深入的研究,因为android框架大量使用了 进程通信机制,所以,在研究android framework前认真研究一下AIDL的实现机制十分有必要的

2.前面讲了aidl是 Android Interface definition language的缩写,它是一种进程通信接口的描述,通过sdk解释器对器进行编译,会把它编译成java代码在gen目录下,类路径与aidl文件的 类路径相同。

3.aidl接口

package com.cao.android.demos.binder.aidl;

import com.cao.android.demos.binder.aidl.AIDLActivity;

interface AIDLService {

void registerTestCall(AIDLActivity cb);

void invokCallBack();

}

它编译后生成的java文件如下

AIDLService.java详细描述了aidl接口的实现,看上面图示,AIDLActivity.aidl编译成了一个接口 AIDLActivity,一个存根类Stub,一个代理类Proxy

public interface AIDLService extends android.os.IInterface//与AIDLActivity.aidl中定义的接口对应的java接口实现

public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService

//继承android.os.Binder,在onTransact完成对通信数据的接收,通过不同通信参数code调用AIDLService接口方 法,并回写调用返回结果AIDLService接口方法需要在

//服务端实现

private static class Proxy implements com.cao.android.demos.binder.aidl.AIDLService

//实现AIDLService接口方法,但是方法只是执行代理远程调用操作,具体方法操作在远端的Stub存根类中实现

总的来说,AIDLActivity.aidl编译会生成一个AIDLActivity接口,一个stub存根抽像类,一个proxy代理类,这个 实现其实根axis的wsdl文件编译生成思路是一致的,

stub存根抽像类需要在服务端实现,proxy代理类被客户端使用,通过stub,proxy的封装,屏蔽了进程通信的细节,对使用者来说就只是一个 AIDLActivity接口的调用

4.根据以上思路使用aidl再看一下AIDLService调用实现代码

--1.在服务端实现AIDLService.Stub抽象类,在服务端onBind方法中返回该实现类

--2.客户端绑定service时在ServiceConnection.onServiceConnected获取onBind返回的IBinder 对象

private ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName className, IBinder service) {

Log("connect service");

mService = AIDLService.Stub.asInterface(service);

try {

mService.registerTestCall(mCallback);

} catch (RemoteException e) {

}

}

注意mConnection在bindservice作为调用参数:bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

--3.AIDLService.Stub.asInterface(service);

public static com.cao.android.demos.binder.aidl.AIDLService asInterface(android.os.IBinder obj)

{

if ((obj==null)) {

return null;

}

android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);

//如果bindService绑定的是同一进程的service,返回的是服务端Stub对象本省,那么在客户端是直接操作Stub对象,并不进行进程 通信了

if (((iin!=null)&&(iin instanceof com.cao.android.demos.binder.aidl.AIDLService))) {

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...