【问题标题】:Single service with multiple AIDL interfaces in AndroidAndroid中具有多个AIDL接口的单一服务
【发布时间】:2014-11-21 16:00:07
【问题描述】:

如何从单个服务提供多个 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 . 这可能吗?

【问题讨论】:

  • 当然,只需在服务的 onBind 方法中返回不同的 IBinders
  • 如果您不知道如何在服务端实现它,请参阅Api Demos,文件RemoteService .java

标签: android android-intent android-service


【解决方案1】:

我也有同样的问题,写了原型进行测试。 实际上它应该通过检查意图并根据意图额外返回不同的活页夹来工作。

但经过测试,我发现 onBind 只为第一个客户端调用一次。 之后,系统会将缓存的binder返回给后续想要绑定服务的客户端。

Android official document描述

多个客户端可以同时连接到服务。但是,只有在第一个客户端绑定时,系统才会调用服务的 onBind() 方法来检索 IBinder。然后系统将相同的 IBinder 传递给任何其他绑定的客户端,而无需再次调用 onBind()。

我仍在尝试寻找方法,但似乎不可能做到。

【讨论】:

  • 我正在使用两个不同的客户端应用程序,并且能够返回不同的 AIDL。在onBind 中,我使用intent.getAction() 检查应用全名,并据此返回不同的接口。它似乎工作。此外,在每个客户端应用程序中,我绑定到 onResume 中的服务并取消绑定 onPause,不确定这是否对您的情况有所影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2019-09-19
相关资源
最近更新 更多