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

Posted

技术标签:

【中文标题】Android:两个独立 APK 的两个服务之间的通信【英文标题】:Android: Communication between two Services of two separate APKs 【发布时间】:2016-06-13 19:13:07 【问题描述】:

情况:

我有一个带有Serviceandroid 系统应用程序(持久),它应该一直运行。 (我们称之为服务 A)

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

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

我试图完成的事情

服务 A 监听事件。当它接收到一个事件时,我希望服务 A 调用正常的应用程序(服务 B),该应用程序应该将响应返回给服务 A。

让两个Service通信的方法

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

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

问题

哪种沟通方式最适合所描述的案例? 当服务 A 想要委托/发送消息给服务 B 并且服务 B 没有运行时会发生什么?它必须得到服务 B 的响应。如果服务 B 没有运行,而服务 A 想要调用它,我是否应该始终启动它?

谢谢!

【问题讨论】:

如果你想快速传递复杂的数据,请看this 【参考方案1】:

对于所描述的案例,哪种沟通方式是“最好的”?

你只引用了两个选项,因为“Aidl”和“Binding”是一回事。您使用 AIDL 来描述和实现跨进程服务绑定的客户端代理和服务器端存根。

鉴于您需要调用和响应,绑定可能是更好的选择。但请注意,除了使用 ParcelableSerializable 或将对象图转换为 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 的两个服务之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

两个独立应用程序之间的通信

android 如何让两个apk相互通信

Android怎么让LinearLayout的两个按钮之间存在一些间隔

Android - 服务是不是在进程之间共享?

从两个项目更新一个 APK

Android APK运行之后出现两个应用图标