//Aidl 需要聲名 導(dǎo)入 引用類。與JAVA 機(jī)制不同
// Declare any non-default types here with import statements
public interface IBookManager extends android.os.IInterface {
/**
* 聲明IBookManager.aidl 中 自定義的方法
*/
public java.util.List<com.rango.ipc.Book> getBookList() throws android.os.RemoteException;
public void addBook(com.rango.ipc.Book book) throws android.os.RemoteException;
/**
* 聲明兩個(gè) id 標(biāo)識 transact 過程中 客戶端請求的方法名稱
*/
static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
/**
* 聲明 一個(gè)Binder 類
*/
public static abstract class Stub extends android.os.Binder implements com.rango.ipc.IBookManager {
/**
* Binder 的唯一標(biāo)識,作為Binder類名標(biāo)識
*/
private static final String DESCRIPTOR = "com.rango.ipc.IBookManager";
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* 用于講服務(wù)端的Binder 對象轉(zhuǎn)換成客戶端所需要的Aidl 接口類型對象
*/
public static com.rango.ipc.IBookManager asInterface(android.os.IBinder obj) {
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
/** 如果客戶端與 服務(wù)端 處在同一進(jìn)程,那么返回服務(wù)端的Sub 對象。*/
if (((iin!=null)&&(iin instanceof com.rango.ipc.IBookManager))) {
return ((com.rango.ipc.IBookManager)iin);
}
/** 否則返回 Stub.proxy 對象 */
return new com.rango.ipc.IBookManager.Stub.Proxy(obj);
}
@Override
public android.os.IBinder asBinder() {
return this;
}
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)
throws android.os.RemoteException {
String descriptor = DESCRIPTOR;
switch (code){
case INTERFACE_TRANSACTION: {
reply.writeString(descriptor);
return true;
}
case TRANSACTION_getBookList: {
data.enforceInterface(descriptor);
java.util.List<com.rango.ipc.Book> _result = this.getBookList();
reply.writeNoException();
reply.writeTypedList(_result);
return true;
}
case TRANSACTION_addBook: {
data.enforceInterface(descriptor);
com.rango.ipc.Book _arg0;
if ((0!=data.readInt())) {
_arg0 = com.rango.ipc.Book.CREATOR.createFromParcel(data);
} else {
_arg0 = null;
}
this.addBook(_arg0);
reply.writeNoException();
return true;
}
default: {
return super.onTransact(code, data, reply, flags);
}
}
}
/**
* Binder 內(nèi)部代理類。由客戶端創(chuàng)建并使用
*/
private static class Proxy implements com.rango.ipc.IBookManager {
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
}
@Override
public android.os.IBinder asBinder() {
return mRemote;
}
public String getInterfaceDescriptor() {
return DESCRIPTOR;
}
@Override
public java.util.List<com.rango.ipc.Book> getBookList() throws android.os.RemoteException {
/** 創(chuàng)建 輸入 和 輸入的 Parcel 對象 */
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.util.List<com.rango.ipc.Book> _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
/**
* 調(diào)用 transact 進(jìn)行RPC(遠(yuǎn)程過程調(diào)用) 掛起當(dāng)前線程(即客戶端線程??!如果在UI線程請求,而服務(wù)端執(zhí)行耗時(shí)操作,此時(shí)等于是讓UI線程陷入等待)。然后服務(wù)端的onTransact 會被調(diào)用。
*/
mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);
_reply.readException();
/** 取出RPC 過程的返回結(jié)果 */
_result = _reply.createTypedArrayList(com.rango.ipc.Book.CREATOR);
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override
public void addBook(com.rango.ipc.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();
}
}
}//end Proxy
}//end Stub
}
END
參考:《Android 開發(fā)藝術(shù)探索》
拓展使用:利用Binder機(jī)制 實(shí)現(xiàn)客戶端與服務(wù)端 雙向通信