建立具有綁定能力的服務時,必須提供一個IBinder對象,它用於給用戶端提供與服務端進行互動的編程介面。有三種方法能夠定義這個介面:
1. 繼承Binder類
如果你的服務是你的應用程式的私人服務,並且跟用戶端運行在同一個進程中,那麼就應該通過繼承Binder類來建立你的介面,並且佛從onBind()方法中返回這個介面的一個執行個體。用戶端接收這個Binder對象,並且能夠使用這個對象直接存取Binder類中實現的或Service中的公用方法。
當你的服務只是在後台給你自己的應用程式工作時,這是首選技術。不使用這種方法建立服務介面的唯一原因是因為你的服務要其他應用程式或跨進程使用。
2. 使用信使(Messenger)
如果你的介面要跨越不同進程來進行工作,那麼你能用信使給服務建立介面。在這種方式中,服務定義了響應不同訊息物件類型的處理器。這個處理器是一個信使的基礎,它能夠跟用戶端共用一個IBinder對象,允許用戶端使用Message對象給服務端發送命令。另外,用戶端能夠定義一個自己的信使,以便服務端能夠給用戶端發送訊息。
這是執行處理序間通訊(IPC)最簡單的方法,因為信使隊列的所有請求都在一個單線程中,因此不需要針對安全執行緒來設計你的服務。
3. 使用AIDL(Android Interface Definition Language)
AIDL(Android 介面定義語言)執行所有的把對象分解成作業系統能夠理解的原語的工作,並且把它們編組到執行IPC(處理序間通訊)的不同進程中。使用信使的技術實際上是基於AIDL架構。就像前面提到的,信使在一個單線程中建立了一個所有用戶端請求的隊列,因此服務每次只能接收一個請求。但是,如果你想要服務同時處理多個請求,那麼就能直接使用AIDL,這種情況下,你的服務必須是多線程的並且要安全執行緒。
要使用直接AIDL,就必須建立一個定義編程介面的.aidl檔案。Android SDK使用這個檔案產生一個實現檔案中定義的介面和處理IPC的抽象類別,然後你能夠在你的服務中進行擴充。
注意:大多數應用程式不應該是AIDL來建立綁定類型的服務,因為它可能需要多線程的能力,並可能導致更複雜的實現。因此,AIDL不適用於大多數應用程式,並且這份文檔不討論怎樣使用它來建立服務,如果你確定需要直接使用AIDL,請看AIDL文檔。