AIDL的理解

来源:互联网 发布:b站电视剧被下架 知乎 编辑:程序博客网 时间:2024/06/06 20:28

AIDL是跨进程通信的接口,考虑多客户端访问服务并发情况,它本身并不会去实现方法,是两个进程约定的一套接口。

以服务-应用的角度来比较好理解。普通服务是在同一个进程的通讯,窗口Activity要去获取服务Service,服务要提供一个binder来连接。

通进程普通服务

Service         

Intent intent = new Intent("android.com.service.MService");public IBinder onBind(Intent intent) {        return mBinder;}

Activity

bindService(intent, mServiceConnect, Service.BIND_AUTO_CREATE);private ServiceConnection mServiceConnect = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {         mBinder = (MBinder) service;    }    .........}

Activity                                                           Service

onServiceConnected      <========         onBind

Activity发起意图,我需要MService服务,通过bindService绑定Mservice, MService服务执行对应的onBind,经过一系列binder处理,Activity获取服务的联系方式mBinder,双发建立通信。


AIDL跨进程服务

参考例子

http://blog.csdn.net/liuhe688/article/details/6400385

Service:

Stub继承的是Binder,本身是一个抽象类,我理解Stub类似interface,自己并不实现方法,实现一个连接方法onBind

IPerson.Stub stub = new IPerson.Stub() {      @Override      public IBinder onBind(Intent intent) {          return stub;   }  

也有这样写法,参考InputManagerService.java写法

MService extends IPerson.Stub {    @Override     ......}

AIDL:

这部分由eclipse生成。提供asInterface就是返回Stub本身。

    public Stub() {          this.attachInterface(this, DESCRIPTOR);      }      public static com.scott.aidl.IPerson asInterface(android.os.IBinder obj) {          if ((obj == null)) {              return null;          }          android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);          if (((iin != null) && (iin instanceof com.scott.aidl.IPerson))) {              return ((com.scott.aidl.IPerson) iin);          }          return new com.scott.aidl.IPerson.Stub.Proxy(obj);      }  
Activity:

Intent intent = new Intent("android.intent.action.MService"); bindService(intent, mServiceConnect, Service.BIND_AUTO_CREATE);private ServiceConnection mServiceConnect = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {         mBinder = IPerson.Stub.asInterface(service);;    }    .........}

Activity                                              AIDL                                    Service

onServiceConnected       <==    asInterface         <===           onBind

Activity发起意图,我要启动MService,跨进程没办法直接联系上MService,Activity找到AIDL,AIDL本身自己是Interface没办法自己实现,AIDL就去找真正干活的MService,间接联系上MService,双方建立通信。
AIDL提供了一个双方约定的接口,Service提供实现方式,Activity调用AIDL interface,AIDL interface找到Service。





0 0
原创粉丝点击