內容大綱:
1.在AIDL的時候正確使用in out inout
上1篇我們用AIDL簡單實現了1個IPC,其中我們談到在定義aidl接口中的除基本類型和AIDL接口外的參數要調價修飾符in out 或 inout中的1種,本文將幫助大家理解in out inout,并讓讀者可以正確的使用in out inout。
在介紹in out inout的區分之前我們先明確兩個基本概念:出發點 和 終點,出發點指調用方,終點指響應方,比如我在客戶端調用aidl接口那末客戶端就是出發點 服務端就是重點,在1次調用中服務端如果要調用1個aidl接口回調給客戶端,那末服務端就是出發點,客戶端就是重點。
然后我們來定義in out inout:
in : 將對象從出發點傳遞給終點,在終點部份中對對象的修改不會反應到出發點,即只輸入
out : 對象中的值不會傳遞給終點,但是在終點部份對對象的修改會反應到出發點,即只輸出
intout : 將對象從出發點傳遞給終點,在終點部份的修改會反應到出發點,即輸入輸出都有影響
我們再用1個具體的例子來看1下這個辨別:
我們來看下客戶真個代碼:
mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBookManager = IBookManager.Stub.asInterface(service); try { mBookManager.registerListener(new IBookListener.Stub() { @Override public void onBookAdd(Book book) throws RemoteException { Log.i("wlh " , "addBook callback : " + book.name); } }); Book book = new Book(); book.name = "TestBook"; mBookManager.addBook(book); Log.i("wlh", book.name); } catch (RemoteException e) { e.printStackTrace(); } unbindService(mServiceConnection); } @Override public void onServiceDisconnected(ComponentName name) { } };
我們輸出了callback 調用addBook 和調用后book對象的名稱。我們再來看下服務真個代碼:
private IBinder mBinder = new IBookManager.Stub() {
@Override
public List getBookList() throws RemoteException {
Log.i("wlh", "getBookList");
return null;
}
@Override
public void addBook(Book book) throws RemoteException {
Log.i("wlh", "addBook : " + book.name);
int N = mCallbacks.beginBroadcast();
book.name += " : server";
for (int i = 0; i 《 N; i++ ) {
mCallbacks.getBroadcastItem(i).onBookAdd(book);
}
mCallbacks.finishBroadcast();
}
@Override
public void registerListener(IBookListener listener) throws RemoteException {
mCallbacks.register(listener);
}
@Override
public void unRegisterListener(IBookListener listener) throws RemoteException {
mCallbacks.unregister(listener);
}
};
視察addBook方法 我們在客戶端傳過來的book中修改了name字段 追加了1個:server,然后我們輸出了客戶端傳遞過來的book名稱。現在我們來看在book的修飾符分別為in out 和inout時候的系統輸出。(我們假定BookListener中的參數都是in,其實BookListener中的in out inout修飾就是出發點 和 終點的轉換,這個時候出發點是調用方服務端 終點是響應方客戶端,具體的讀者可自行分析)
in:
我們可以先猜想1下輸出,in表示數據會傳遞到終點,那末服務端會輸出TestBook,然后由于對對象的修改不會反應到出發點,所以對象不會反應到客戶端,客戶端仍然輸出的是TestBook,而callback中的回調是TestBook : server,我們來看下實際效果:
out:
out不會將數據傳遞到終點在這里也就是服務端,那末服務端會輸出null, 然后由于對象修改會反應到出發點也就是客戶端,所以客戶端會輸出 null : server,我們來看下實際效果:
inout:
inout即會把數據傳遞到終點,出發點也會響應終點的變化,那末服務端會輸出 TestBook
然后客戶端輸出 TestBook : server, 我們來看下實際效果:
歡迎關注公眾號:CoderHouse