通过AIDL进程间通信

来源:互联网 发布:淘宝的a3狗粮怎么样 编辑:程序博客网 时间:2024/06/07 19:23

AIDL只不过是一种简化代码书写的方法,进程间通信实际上是由binder机制实现,AIDL本身不具备进程间通信的功能。


通俗点来说,binder机制的使用:大家(客户端和服务端)都定义有相同的AIDL接口,你实现的那部分接口由我来调用,我实现的由你调用;

那如何实现方法的调用呢,本质来说就是将各自的对象传递过去(Service-->Client : onBind()返回的Binder转化为AIDL接口所属的实例;Client-->Service:client的实例作为参数传入由client调用的方法中)

//服务端//AIDL文件package com.leo.aidl;interface infa {methodInvokedByClient(Object o);methodInvokedByService();}//服务端Servicepublic class sv extends Service {//用于获得客户端创建的实例,从而调用由客户端实现的方法Object o;//实现infa接口的Binder类private Binder mBinder = new infa.Stub(){//实现methodInvokedByClientpublic void methodInvokedByClient(Object o){..,this.o = o, ..};//<span style="font-family: Arial, Helvetica, sans-serif;">client的实例作为参数传入由client调用的方法中</span><div></div>}//onBind返回mBinderpublic IBinder onBind(Intent intent) { return mBinder;}  //调用由客户端实现的方法methodInvokedByService()o.methodInvokedByService();}

//客户端//AIDL文件package com.leo.aidl;interface infa {methodInvokedByClient(Object o);methodInvokedByService();}//客户端activitypublic class a extends Activity {Object o ;protected void onCreate(...) {//请求连接服务端bindService(.. , mConnection ,...);}private ServiceConnection mConnection = new ServiceConnection(){//onBind被调用后,系统会回调onServiceConnectionpublic void onServiceConnected(... , IBinder service){        //将Binder转化为infa的实现类对象infa i = infa.Stub.asInterface(service);//此时客户端就可以调用服务端的方法了,同时也将客户端定义的实例传输到了服务端i.methodInvokedByClient(o);}}//实现methodInvokedByServicepublic void methodInvokedByService() {...};}




1 0