情况:
我有一个 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/