2017年11月14日 星期二

Android Interacting with Other Apps using Messenger or AIDL

在Linux階層上的IPC,Android用了iBinder來包裝之間溝通的管道。iBinder有兩種形式可以傳遞資料。預備知識是使用android的service並且exported,可使其他application能夠喚起該service。


第一種是用Messenger封裝起來,使用Message來傳遞,開啟Service後,建立一個Messenger instance,使用Messenger的getBinder提出傳給service,而client也是透過取得的binder來創建Messenger來溝通。並且可以使用Messenger.replyTo來建立一個收訊息的接口來跟遠端service溝通。溝通的單位是bundle。

第二種是使用Android Interface Definition Language,簡單的說就是iBinder中定好溝通的規則,也就是functions。在server(service端)建立好iInterface的aidl實作的binder,在service中回傳該binder,然後在client端中也是用aidl檔承接轉型該ibinder至iInterface,雙方就透過iInterface中定義好的functions溝通。





一些概念解釋:


iBinder就是android中建立在ipc上的java層,用來使用ipc來溝通的。

Messenger其實就是封裝iBinder,使用Messenger類來透過ibinder來溝通。

AIDL則是在ibinder層先定義好傳輸資料,接著雙方用該接口來互動。該檔案需在sdk中編譯,並且對應相同的pacakge name,比如說你aidl package name是com.handsome.hydra你就得放在src/main/aidl/com/handsome/hydra/的資料夾下放IInterface.aidl,此後sdk編譯好後你才能使用IInterface.stub方法。

若你有使用ipc shared memory, message queue的經驗,基本上java那層就是封裝過的實作層,讓你用他們定義好的資料傳輸方式來使用ipc就是了。