Android:两个独立 APK 的两个服务之间的通信
Posted
技术标签:
【中文标题】Android:两个独立 APK 的两个服务之间的通信【英文标题】:Android: Communication between two Services of two separate APKs 【发布时间】:2016-06-13 19:13:07 【问题描述】:情况:
我有一个带有Service
的 android 系统应用程序(持久),它应该一直运行。 (我们称之为服务 A)
然后有另一个应用程序(不是系统应用程序;普通应用程序)也有一个Service
。但是这个Service
可能会运行,也可能不会运行,因为如果需要资源,Android 操作系统会杀死它。 (我们称之为服务 B)
简而言之:我们有两个应用程序(因此有 2 个 APK)可以使用相同的证书进行签名。 (所以他们可以在同一个进程中运行吗?)
我试图完成的事情
服务 A 监听事件。当它接收到一个事件时,我希望服务 A 调用正常的应用程序(服务 B),该应用程序应该将响应返回给服务 A。
让两个Service通信的方法
我可以让他们使用以下方式进行交流:
绑定(使用 AIDL) 消息(但不是最佳的,因为必须传递复杂的对象)问题
哪种沟通方式最适合所描述的案例? 当服务 A 想要委托/发送消息给服务 B 并且服务 B 没有运行时会发生什么?它必须得到服务 B 的响应。如果服务 B 没有运行,而服务 A 想要调用它,我是否应该始终启动它?谢谢!
【问题讨论】:
如果你想快速传递复杂的数据,请看this 【参考方案1】:对于所描述的案例,哪种沟通方式是“最好的”?
你只引用了两个选项,因为“Aidl”和“Binding”是一回事。您使用 AIDL 来描述和实现跨进程服务绑定的客户端代理和服务器端存根。
鉴于您需要调用和响应,绑定可能是更好的选择。但请注意,除了使用 Parcelable
、Serializable
或将对象图转换为 JSON 或其他东西之外,没有 IPC 方法可以很好地支持“复杂对象”。
当服务 A 想要委托/发送消息给服务 B 并且服务 B 没有运行时会发生什么?
当您调用 startService()
或 bindService()
时,Android 会为 App B 派生一个进程并创建服务实例(调用其 onCreate()
)方法。此时,行为与进程和服务已在运行时相同。
【讨论】:
非常感谢您提供的信息丰富的回答 - 我很感激!所以你会绑定 Service 并使用 AIDL 来描述 API? @sjkm:是的。如果你想要一个同步响应,比如一个常规的方法调用,让你的 AIDL 接口在方法上定义一个返回值。如果您想要异步响应,请为服务 B 和将从 A 传递的回调对象定义 AIDL。然后,在 AIDL 定义的方法中传递回调对象的实例,B 可以使用它来调用方法在 A 的回调上提供异步结果。有关回调方法的示例,请参阅this sample app。 谢谢!看起来很棒。明天我会更深入地研究它。祝你有个愉快的夜晚。 我想问你最后一个问题:Messenger(没有 AIDL)只能用于同一个应用程序(但远程进程),对吧? @sjkm:您可以将其用于回调,而不是自定义 AIDL 定义的回调。我看不出它能给你带来什么。【参考方案2】:如果包含服务 A 的应用程序是系统应用程序,那么这两个应用程序如何使用相同的证书进行签名?
您有平台证书的访问权限吗?
无论如何,aidl 将是一个不错的选择,因为您需要服务 B 的响应。
【讨论】:
您无需使用平台证书签署应用程序即可使其成为系统应用程序。它只需要安装在“/system/app”/“system/priv-app”文件夹中...以上是关于Android:两个独立 APK 的两个服务之间的通信的主要内容,如果未能解决你的问题,请参考以下文章