您的位置:首页 > 移动开发 > Android开发

初步理解android中的aidl

2017-03-23 21:15 225 查看
本篇文章不讲aidl是如何创建,只是本人对aidl结构的梳理与理解。aidl的核心是binder在进程间的传递,具体如何传递先不做解释。

首先通过binder由client发起远程请求,此binder就是service中的binder:

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return binder;
}
IBookManager.Stub binder = new IBookManager.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

}

@Override
public List<Book> getBookList() throws RemoteException {
return bookList;
}

@Override
public void addBook(Book book) throws RemoteException {
book

}
};


即是自动生成的Stub,在调用静态方法asInterface()把stub转为IBookManager,这个过程

在同一个进程和不同进程调用时处理方式也是不一样的和不同进程调用时处理方式也是不一样的,

public static com.xiaodong.ipctest.IBookManager asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.xiaodong.ipctest.IBookManager))) {
return ((com.xiaodong.ipctest.IBookManager)iin);
}
return new com.xiaodong.ipctest.IBookManager.Stub.Proxy(obj
);
}


只有在不同进程间通信才会调用代理(Proxy)的IBookManager。Proxy实现了IBookManager接口,所以addbook(),getBookList()都在Proxy中处理。具体来说:这个方法运行在客户端,当客户端调用时首先创建该方法所需要的输入型Parcel对象_data,输出型对象Parcel对象_reply和返回值对象List,然后把参数写入_data中,调用transact方法发起远程调用(RPC)请求,同时挂起线程。此时服务端调用onTransact方法,直到远程调用返回后,当前线程执行并从_reply中取RPC返回值,然后返回result。

@Override public java.util.List<com.xiaodong.ipctest.Book> getBookList() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.util.List<com.xiaodong.ipctest.Book> _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);
_reply.readException();
_result = _reply.createTypedArrayList(com.xiaodong.ipctest.Book.CREATOR);
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}


Created with Raphaël 2.1.0ClientClientBinderBinder发起远程请求(挂起)返回数据(唤醒client)

Created with Raphaël 2.1.0BinderBinderdatadataServiceService线程池线程池replyreply写入参数TransactonTransact写入结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: