Android:两个独立APK的两个服务之间的通信

标签 android service ipc messaging aidl

情况:

我有一个 Android 系统应用程序(持久),其中包含一个应该始终运行的服务。 (我们称之为服务A)

然后还有另一个应用程序(不是系统应用程序;普通应用程序)也有一个服务。但是此 Service 可能会运行也可能不会运行,因为 Android 操作系统在需要资源时会杀死它。 (我们称之为服务 B)

简而言之:我们有两个可以使用同一证书进行签名的应用程序(因此有 2 个 APK)。 (所以它们可以在同一个进程中运行,对吧?)

我想要实现的目标

服务A监听事件。当它收到事件时,我希望服务 A 调用普通应用程序(服务 B),该应用程序应该向服务 A 提供响应。

让两个服务进行通信的方法

我可以让他们使用以下方式进行交流:

  • 绑定(bind)(使用 AIDL)
  • 消息传递(但不是最佳选择,因为必须传递复杂对象)

问题

  • 对于所描述的案例,哪种沟通方式是“最佳”方式?
  • 当服务 A 想要向服务 B 委托(delegate)/发送消息而服务 B 未运行时,会发生什么情况?它必须得到服务 B 的响应。如果服务 A 想要调用它时服务 B 没有运行,我是否应该始终启动它?

谢谢!

最佳答案

Which way to communicate is "the best" one for the described case?

您只引用了两个选项,因为“Aidl”和“Binding”是同一件事。您可以使用 AIDL 来描述和实现跨进程服务绑定(bind)的客户端代理和服务器端 stub 。

考虑到您需要调用和响应,绑定(bind)可能是更好的选择。但请注意,除了使用 Parcelable、Serialized 或将对象图转换为 JSON 等之外,没有任何 IPC 方法可以很好地支持“复杂对象”。

What happens when Service A wants to delegate/send a message to Service B and Service B is not running?

当您调用 startService()bindService() 时,Android 会为 App B fork 一个进程并创建服务实例(调用其 onCreate( )) 方法。此时,行为与进程和服务已经在运行一样。

关于Android:两个独立APK的两个服务之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797450/

相关文章:

Grails 集成测试不能在空服务对象上调用方法?

c - 如何在C中打印linux上a和b之间的IPC消息?

javascript - WWW 中的页间通信?

android - 构建 APK : Algorithm HmacPBESHA256 not available 时出错

android - 在安卓 P : Dropping event due to no window focus: KeyEvent

Android:关闭/丢失蓝牙连接或文件接收 -> 做点什么

c# - 通过套接字动态配置 .NET 客户端

c - 如何将结构中的多个 void 指针取消引用到 1 block 内存中?

android - 如何从 onLayout 重新加载界面?

Android Heads-up 通知在几秒后消失