Android 进程通信机制之 AIDL(2)

private static class Proxy implements net.bingyan.library.IBookManager { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override public android.os.IBinder asBinder() { return mRemote; } public java.lang.String getInterfaceDescriptor() { return DESCRIPTOR; } /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ @Override public void addBook(net.bingyan.library.Book book) throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); if ((book != null)) { _data.writeInt(1); book.writeToParcel(_data, 0); } else { _data.writeInt(0); } mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0); _reply.readException(); } finally { _reply.recycle(); _data.recycle(); } } @Override public java.util.List<net.bingyan.library.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<net.bingyan.library.Book> _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0); _reply.readException(); _result = _reply.createTypedArrayList(net.bingyan.library.Book.CREATOR); } finally { _reply.recycle(); _data.recycle(); } return _result; } }

对生成的这三个类的说明如下:

IBookManager 这个类是我们定义的接口,android studio 给它添加了一个父类,让它继承自 android.os.interface 这个接口,这个接口只有一个方法 IBinder asBinder(),这样 IBookManager 中就有三个带实现的方法了,它是服务端进程和客户端进程通信的窗口。

Stub 是个抽象类,这个类继承自 android.os.Binder 类,并且实现的了 IBookManager 这个接口。在 Stub 中,已经实现了 asBinder() 这个接口方法,还有两个是我们定义的 AIDL 接口方法留给继承它的子类去实现。它用在服务端,因此服务端需要实现这两个方法。

Proxy 顾名思义是一个代理类,它是服务端在客户端的一个代理,它也实现了 IBookManager接口,并且实现了 IBookManager 中的所有方法。它用在客户端,是服务端在客户端的代理。

现在我们对这三个类逐个分析:

IBookManager 这个类没什么好说的,它只是简单继承了 asInterface 这个接口,作用就是将 IBookManager 转换成 IBinder。

Proxy 这个类上面已经提到过了,它就是进程间通信机制的一个封装类,他的内部实现机制就是 Binder,通过构造方法我们也容易看出来。它的构造方法接受一个 IBinder 类型的参数,参数名为 remote,显然,它代表着服务端。我们看看这个类中的方法 addBook() 和 getBookList():

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/633ceaacfd10c53714a976eb5608e6de.html