內(nèi)容大綱:
1.在AIDL的時候正確使用in out inout
上1篇我們用AIDL簡單實現(xiàn)了1個IPC,其中我們談到在定義aidl接口中的除基本類型和AIDL接口外的參數(shù)要調(diào)價修飾符in out 或 inout中的1種,本文將幫助大家理解in out inout,并讓讀者可以正確的使用in out inout。
在介紹in out inout的區(qū)分之前我們先明確兩個基本概念:出發(fā)點 和 終點,出發(fā)點指調(diào)用方,終點指響應(yīng)方,比如我在客戶端調(diào)用aidl接口那末客戶端就是出發(fā)點 服務(wù)端就是重點,在1次調(diào)用中服務(wù)端如果要調(diào)用1個aidl接口回調(diào)給客戶端,那末服務(wù)端就是出發(fā)點,客戶端就是重點。
然后我們來定義in out inout:
in : 將對象從出發(fā)點傳遞給終點,在終點部份中對對象的修改不會反應(yīng)到出發(fā)點,即只輸入
out : 對象中的值不會傳遞給終點,但是在終點部份對對象的修改會反應(yīng)到出發(fā)點,即只輸出
intout : 將對象從出發(fā)點傳遞給終點,在終點部份的修改會反應(yīng)到出發(fā)點,即輸入輸出都有影響
我們再用1個具體的例子來看1下這個辨別:
我們來看下客戶真?zhèn)€代碼:
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 調(diào)用addBook 和調(diào)用后book對象的名稱。我們再來看下服務(wù)真?zhèn)€代碼:
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名稱。現(xiàn)在我們來看在book的修飾符分別為in out 和inout時候的系統(tǒng)輸出。(我們假定BookListener中的參數(shù)都是in,其實BookListener中的in out inout修飾就是出發(fā)點 和 終點的轉(zhuǎn)換,這個時候出發(fā)點是調(diào)用方服務(wù)端 終點是響應(yīng)方客戶端,具體的讀者可自行分析)
in:
我們可以先猜想1下輸出,in表示數(shù)據(jù)會傳遞到終點,那末服務(wù)端會輸出TestBook,然后由于對對象的修改不會反應(yīng)到出發(fā)點,所以對象不會反應(yīng)到客戶端,客戶端仍然輸出的是TestBook,而callback中的回調(diào)是TestBook : server,我們來看下實際效果:
out:
out不會將數(shù)據(jù)傳遞到終點在這里也就是服務(wù)端,那末服務(wù)端會輸出null, 然后由于對象修改會反應(yīng)到出發(fā)點也就是客戶端,所以客戶端會輸出 null : server,我們來看下實際效果:
inout:
inout即會把數(shù)據(jù)傳遞到終點,出發(fā)點也會響應(yīng)終點的變化,那末服務(wù)端會輸出 TestBook
然后客戶端輸出 TestBook : server, 我們來看下實際效果:
歡迎關(guān)注公眾號:CoderHouse