2014-11-21 56 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