Android Bound 服务:Inter vs Intra - 使用 Messenger 的应用程序通信
Posted
技术标签:
【中文标题】Android Bound 服务:Inter vs Intra - 使用 Messenger 的应用程序通信【英文标题】:Android Bound services: Inter vs Intra - app communication using Messenger 【发布时间】:2020-12-07 11:12:30 【问题描述】:我有 2 个 android 应用 - App1 和 App2。我在 App1 中有一个绑定服务 - ServiceA。 App1 中的多个服务和活动绑定到 ServiceA 并在其上调用方法。现在,我想将数据从 ServiceA 发送到存在于 App2 中的远程服务。我将使用Messenger API 公开 ServiceA 中的 binder 对象以进行进程间通信。
据我了解,App1 中依赖于ServiceA 的所有活动和服务现在也需要使用Messenger
API 来访问活页夹。这是正确的吗?
如果是,有没有办法只对 ServiceA 进行更改,以便它可以与远程服务交换数据而不更改其现有客户端?
P.S:该服务不需要处理多个并发请求,这是我决定使用 Messenger
API 的主要原因之一。
【问题讨论】:
你现在从onBind()
返回什么?您的客户现在是否使用 AIDL 调用 Service
中的方法?
既然你想从ServiceA
发送数据到ServiceB
,你应该只需要在一个方向上实现Messenger
API(即:ServiceA
将绑定到ServiceB
和成为Service
的客户,而不是相反)。还是我错过了什么?
@DavidWasser ServiceA 的现有客户端包括来自 App1 的活动和其他服务。 onBind
返回通过扩展 Binder
类创建的活页夹。
@DavidWasser App2 是新的,将具有需要与 ServiceA 交换数据的 ServiceB。 ServiceA 将使用Messenger
框架公开一个活页夹。 - 这对我来说很清楚。 App1 中ServiceA 的现有客户端绑定到它并直接在其上调用一些方法。如果ServiceA要使用Messenger
,我的理解是现有客户端将不再能够直接调用方法,而必须使用他们在onServiceConnection
中收到的绑定器创建一个Messenger
对象并传递Message
s每当他们需要从 ServiceA 交换/获取数据时。对吗?
【参考方案1】:
您应该能够提供基于Messenger
的接口和直接接口。我自己没有测试过,但你可以试试这个:
在onBind()
中,您会收到Intent
。这是客户端在调用bindService()
时使用的Intent
。您可以在Intent
中使用 2 个不同的 ACTION(或使用“额外”),以便区分来自 App1 的客户端和 App2 的客户端的调用。然后只返回基于Messenger
的Binder
或您当前的实现,具体取决于哪个客户端调用了onBind()
。
告诉我进展如何!
【讨论】:
成功了,谢谢!我使用意图操作来区分客户端。以上是关于Android Bound 服务:Inter vs Intra - 使用 Messenger 的应用程序通信的主要内容,如果未能解决你的问题,请参考以下文章
android基础部分再学习---再谈Service进程服务通信
Goroutines vs asyncio 任务 + CPU-bound 调用的线程池