跨进程通信(IPC)
1.AIDL MESSENGER(是封装好的AIDL)看了几遍没什么太深的印象,于是手写一个
照抄树上的栗子:
需要传输的数据 来一个:
public class Book implements Parcelable{ public String bookName; public int bookId; public Book(String bookName, int bookId) { this.bookName = bookName; this.bookId = bookId; } protected Book(Parcel in) { bookName = in.readString(); bookId = in.readInt(); } public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel in) { return new Book(in); } @Override public Book[] newArray(int size) { return new Book[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(bookName); dest.writeInt(bookId); } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", bookId=" + bookId + '}'; } }
2. 然后 IBookManager 来一个 里面主要定义了一个 DESCRIPTOR 来标识自己 然后两个方法 getBookList(),addBook(Book book)
public interface IBookManager extends IInterface { String DESCRIPTOR = "cn.uflycn.com.aidltest.aidl_test.aidl.IBookManager"; List<Book> getBookList() throws RemoteException; void addBook(Book book) throws RemoteException; }
3.然后再写它抽象的内部类Stub
public static abstract class Stub extends Binder implements IBookManager { public static final int TRANSACTION_getBookList = Binder.FIRST_CALL_TRANSACTION + 0; public static final int TRANSACTION_addBook = Binder.FIRST_CALL_TRANSACTION + 1; public Stub() { attachInterface(this, DESCRIPTOR); } @Override public IBinder asBinder() { return this; } public static IBookManager asInterface(IBinder obj) { if (obj == null) { return null; } IInterface inn = obj.queryLocalInterface(DESCRIPTOR); if (inn != null && inn instanceof IBookManager) { return (IBookManager) inn; } return new Proxy(obj); } @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { switch (code) { case INTERFACE_TRANSACTION: reply.writeString(DESCRIPTOR); return true; case TRANSACTION_getBookList: data.enforceInterface(DESCRIPTOR); List<Book> result = getBookList(); reply.writeNoException(); reply.writeTypedList(result); return true; case TRANSACTION_addBook: data.enforceInterface(DESCRIPTOR); Book book; if (data.readInt() != 0) { book = Book.CREATOR.createFromParcel(data); } else { book = null; } this.addBook(book); reply.writeNoException(); return true; default: return super.onTransact(code, data, reply, flags); } } private static class Proxy implements IBookManager { private IBinder mRemote; public Proxy(IBinder remote) { mRemote = remote; } @Override public List<Book> getBookList() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); List<Book> result; try { data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(TRANSACTION_getBookList, data, reply, 0); reply.readException(); result = reply.createTypedArrayList(Book.CREATOR); } finally { reply.recycle(); data.recycle(); } return result; } @Override public void addBook(Book book) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(DESCRIPTOR); if (book != null) { data.writeInt(1); book.writeToParcel(data, 0); } else { data.writeInt(0); } mRemote.transact(TRANSACTION_addBook, data, reply, 0); reply.readException(); } finally { reply.recycle(); data.recycle(); } } @Override public IBinder asBinder() { return mRemote; } } }
刚开始的时候忘记重写 ontransact 方法,获取到的结果都是空的,添加也加不进去,所以onTransct 是服务端处理数据返回结果的地方。
写了好几遍感觉