初步理解android中的aidl
2017-03-23 21:15
225 查看
本篇文章不讲aidl是如何创建,只是本人对aidl结构的梳理与理解。aidl的核心是binder在进程间的传递,具体如何传递先不做解释。
首先通过binder由client发起远程请求,此binder就是service中的binder:
即是自动生成的Stub,在调用静态方法asInterface()把stub转为IBookManager,这个过程
在同一个进程和不同进程调用时处理方式也是不一样的和不同进程调用时处理方式也是不一样的,
只有在不同进程间通信才会调用代理(Proxy)的IBookManager。Proxy实现了IBookManager接口,所以addbook(),getBookList()都在Proxy中处理。具体来说:这个方法运行在客户端,当客户端调用时首先创建该方法所需要的输入型Parcel对象_data,输出型对象Parcel对象_reply和返回值对象List,然后把参数写入_data中,调用transact方法发起远程调用(RPC)请求,同时挂起线程。此时服务端调用onTransact方法,直到远程调用返回后,当前线程执行并从_reply中取RPC返回值,然后返回result。
Created with Raphaël 2.1.0ClientClientBinderBinder发起远程请求(挂起)返回数据(唤醒client)
Created with Raphaël 2.1.0BinderBinderdatadataServiceService线程池线程池replyreply写入参数TransactonTransact写入结果
首先通过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写入结果
相关文章推荐
- android的文件系统结构及其引导过程的初步理解
- android的文件系统结构及其引导过程的初步理解
- 初步理解Android的MediaScanner(2)
- Android adt 初步理解和分析(一)
- Android实战技术:深入理解Android的RPC方式与AIDL
- android的文件系统结构及其引导过程的初步理解
- 对Android平台Linux部分的初步理解
- 理解Android的AIDL原理之代理模式
- android 进程间通信 aidl 简单理解
- Android adt 初步理解和分析(三)
- android的文件系统结构及其引导过程的初步理解
- Android AIDL 理解及开发要点
- android的文件系统结构及其引导过程的初步理解
- 初步理解android的MediaScanner(1)
- Android之Activity---初步理解
- [转]android的文件系统结构及其引导过程的初步理解
- android的文件系统结构及其引导过程的初步理解
- android的文件系统结构及其引导过程的初步理解
- Android AIDL的重新理解
- Android内核理解——初步理解context和activity的关系