概述
我們知道,在Android app中的眾多activity,service等組件可以運行在同一進程中,也可以運行在不同進程中。當組件運行在同一進程中進行通信就顯得比較簡單,在之前的Android線程間通信機制中已經講過了;而當它們運行在不同的進程 中時,就需要使用我們本文中所要介紹的Binder機制了。
Binder作為一種進程間通信機制,負責提供遠程調用的功能(RPC),它的系統組件主要包括四種:Client, Server, ServiceManager, Binder Driver. 它們之間的關系如下圖所示:
Paste_Image.png
從圖中我們可以看出,Client, Server, ServiceManager運行在系統的用戶態,而Binder Driver運行在內核態。為了完成Client端到Server端的通信任務,用戶空間的需要操作Binder Driver提供的/dev/binder文件來完成交互。那么ServiceManager的工作是什么呢?ServiceManager負責管理Server并向Client端提供一個Server的代理接口(proxy)。通過代理接口中定義的方法,Client端就可以使用Server端提供的服務了。整個過程如下:
Client端調用代理接口的方法,將Client的參數打包為parcel對象發送給內核空間中BinderDriver;
Server端讀取到BinderDriver中的請求數據,將parcel對象解包并處理;
處理好后,將處理結果打包返回給BinderDriver,再交給Client端。
另外,Client端與Server端的調用過程是同步的,即在Server返回結果之前,Client端是阻塞的。調用過程如下所示:
Paste_Image.png