上一篇說了,AIDL是為了實作IPC,預定義的類似模闆的代碼。甚至可以像模闆一樣的生成代碼,就像mybatis使用MBG一樣。
這一篇主要就生成的代碼來講一下。aidl生成代碼方法比較簡單,建議搜個教程生成以後對照着看。
方法含義:
1.DESCRIPTOR:Binder的唯一辨別,通常是目前Binder的類名。
2.asInterface(android.os.IBinder obj):static傳回生成類的方法,同程序傳回服務端的Stub本身,不同程序傳回系統封裝後的Stub.Proxy。
我的了解:這是遠端代理的應用,代理模式主要是為了控制通路,是以,不在同一程序的,就傳回代理,用戶端利用代理來完成對服務端的通路。是以接下來看onTransact也是滿滿的代理模式的影子。
如何判斷是否是同程序?
IBinder.queryLocalInterface(DESCRIPTOR),查本地的Interface,找得到的是同程序的,與第一點唯一辨別對應。
3.onTransact:
服務端通過code來确定用戶端想要調用的方法。是不是很像遠端代理?

遠端代理:調用代理的方法 -> 代理去調用實際的方法 -> 實際對象傳回資料給代理 -> 代理把資料給調用者 (伴随很多的網絡和IO操作)
對應:用戶端的transact調用服務端代理的onTransact方法 -> 服務端代理onTransact方法調用Binder的實際方法 -> 服務端Binder把資料傳回給onTransact -> 服務端的onTransact把真實資料傳回給用戶端。
借助《Head First 設計模式》的圖更容易了解:
是以,Binder是遠端代理的應用,因為要進行IO操作,是以,對象需要序列化,一切就得以解釋了。
如有不對的地方,請不吝賜教。