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 应用 - App1App2。我在 App1 中有一个绑定服务 - ServiceAApp1 中的多个服务和活动绑定到 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对象并传递Messages每当他们需要从 ServiceA 交换/获取数据时。对吗? 【参考方案1】:

您应该能够提供基于Messenger 的接口和直接接口。我自己没有测试过,但你可以试试这个:

onBind() 中,您会收到Intent。这是客户端在调用bindService() 时使用的Intent。您可以在Intent 中使用 2 个不同的 ACTION(或使用“额外”),以便区分来自 App1 的客户端和 App2 的客户端的调用。然后只返回基于MessengerBinder 或您当前的实现,具体取决于哪个客户端调用了onBind()

告诉我进展如何!

【讨论】:

成功了,谢谢!我使用意图操作来区分客户端。

以上是关于Android Bound 服务:Inter vs Intra - 使用 Messenger 的应用程序通信的主要内容,如果未能解决你的问题,请参考以下文章

Android官方文档之Bound Services

android基础部分再学习---再谈Service进程服务通信

Goroutines vs asyncio 任务 + CPU-bound 调用的线程池

Android四大组件service之Bound Service

Android总结 - Service

Android17.5 利用Messenger实现进程间通信(IPC)