天天看點

IPC系列(二)- AIDL

上一篇說了,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來确定用戶端想要調用的方法。是不是很像遠端代理?

IPC系列(二)- AIDL

  遠端代理:調用代理的方法 -> 代理去調用實際的方法 -> 實際對象傳回資料給代理 -> 代理把資料給調用者 (伴随很多的網絡和IO操作)

  對應:用戶端的transact調用服務端代理的onTransact方法 -> 服務端代理onTransact方法調用Binder的實際方法 -> 服務端Binder把資料傳回給onTransact -> 服務端的onTransact把真實資料傳回給用戶端。

借助《Head First 設計模式》的圖更容易了解:

IPC系列(二)- AIDL

是以,Binder是遠端代理的應用,因為要進行IO操作,是以,對象需要序列化,一切就得以解釋了。

如有不對的地方,請不吝賜教。

IPC系列(二)- AIDL