2014-11-21 49 views
1

如何爲一個服務提供多個AIDL接口?該方案如下:Android中具有多個AIDL接口的單個​​服務

    |---Client_1 
      |--AIDL1--|  ... 
      |   |---Client_6 
MyService | 
      |   |---Client_4 
      |--AIDL2--|  ... 
        |---Client_9 
  • 多AIDL單服務;
  • 每個客戶端可以訪問任意數量的AIDL接口;
  • 爲了更好地理解,考慮上圖,其中一些客戶端(例如Client_1,Client_8)僅使用一個接口,而其他客戶端(例如Client_4,Client_5,Client_6)同時訪問AIDL1和AIDL2。

我的想法是使用意圖從方法public IBinder onBind(Intent intent)以某種方式找出客戶端應用程序的類型的主叫的AIDL在這個客戶端感興趣的東西。這可能嗎?

+0

當然,只是在服務的onBind方法中返回不同的IBinder – pskink 2014-11-21 16:39:21

+0

如果您不知道如何在服務端實現它,請參閱Api演示,文件RemoteService .java – pskink 2014-11-21 18:38:12

回答

0

我也有同樣的問題,並編寫測試原型。 實際上,它應該通過檢查意圖並根據意向附加項返回不同的活頁夾。

但經過測試,我發現onBind只爲第一個客戶端調用一次。 之後,系統會將緩存的綁定程序返回給想要綁定該服務的更高版本的客戶端。

的Android official document描述

多個客戶端可以連接到服務一次。但是,只有當第一個客戶端綁定時,系統纔會調用您的服務的onBind()方法來檢索IBinder。系統然後將相同的IBinder傳遞給綁定的任何其他客戶端,而無需再次調用onBind()。

我仍試圖找到方法,但似乎不可能做到這一點。

+0

我使用兩個不同的客戶端應用程序,返回不同的AIDL。在'onBind'中,我使用'intent.getAction()'檢查應用程序的全名,並根據它返回不同的接口。它似乎工作。另外,在每個客戶端應用程序中,我都綁定到'onResume'中的服務,並在'onPause'上解除綁定,不確定這是否會影響您的情況。 – Daniel 2014-12-02 15:17:16