Android: 两个独立 APK 的两个服务之间的通信
Android: Communication between two Services of two separate APKs
情况:
我有一个 Android 系统应用程序 (持久性)和一个 Service
应该一直 运行。 (我们称之为服务 A)
然后还有另一个应用程序(不是系统应用程序;普通应用程序)也有一个 Service
。但是这个 Service
可能会 运行 也可能不会 运行 因为 Android OS 会在它需要资源时杀死它。 (我们称之为服务 B)
简而言之:我们有两个应用程序(因此有 2 个 APK)可以使用相同的证书进行签名。 (所以他们可以 运行 在同一个过程中对吗?)
我想完成的事情
服务A监听事件。当它收到一个事件时,我希望服务 A 调用正常的应用程序(服务 B),它应该向服务 A 返回响应。
让两个服务进行通信的方法
我可以让他们使用以下方式进行交流:
- 绑定(使用 AIDL)
- 消息传递(但不是最佳选择,因为必须传递复杂的对象)
问题
- 哪种沟通方式"the best"适用于所描述的案例?
- 当服务 A 想要 delegate/send 向服务 B 发送消息而服务 B 未 运行ning 时会发生什么?它必须得到服务 B 的响应。如果服务 A 想要调用它时它不是 运行ning,我是否应该始终启动服务 B?
谢谢!
Which way to communicate is "the best" one for the described case?
您只引用了两个选项,因为 "Aidl" 和 "Binding" 是同一回事。您使用 AIDL 来描述和实现用于跨进程服务绑定的客户端代理和服务器端存根。
鉴于您需要呼叫和响应,绑定可能是更好的选择。但是请注意,除了使用 Parcelable
、Serializable
或将对象图转换为 JSON 之类的东西之外,没有任何 IPC 方法可以很好地支持 "complex objects"。
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 派生一个进程并创建服务实例(调用其 onCreate()
)方法。此时,行为与进程和服务已经 运行.
相同
如果包含服务 A 的应用程序是系统应用程序,那么如何使用相同的证书对这两个应用程序进行签名?
您是否有权限获取平台证书?
无论如何,aidl 将是一个不错的选择,因为您需要服务 B 的响应。
情况:
我有一个 Android 系统应用程序 (持久性)和一个 Service
应该一直 运行。 (我们称之为服务 A)
然后还有另一个应用程序(不是系统应用程序;普通应用程序)也有一个 Service
。但是这个 Service
可能会 运行 也可能不会 运行 因为 Android OS 会在它需要资源时杀死它。 (我们称之为服务 B)
简而言之:我们有两个应用程序(因此有 2 个 APK)可以使用相同的证书进行签名。 (所以他们可以 运行 在同一个过程中对吗?)
我想完成的事情
服务A监听事件。当它收到一个事件时,我希望服务 A 调用正常的应用程序(服务 B),它应该向服务 A 返回响应。
让两个服务进行通信的方法
我可以让他们使用以下方式进行交流:
- 绑定(使用 AIDL)
- 消息传递(但不是最佳选择,因为必须传递复杂的对象)
问题
- 哪种沟通方式"the best"适用于所描述的案例?
- 当服务 A 想要 delegate/send 向服务 B 发送消息而服务 B 未 运行ning 时会发生什么?它必须得到服务 B 的响应。如果服务 A 想要调用它时它不是 运行ning,我是否应该始终启动服务 B?
谢谢!
Which way to communicate is "the best" one for the described case?
您只引用了两个选项,因为 "Aidl" 和 "Binding" 是同一回事。您使用 AIDL 来描述和实现用于跨进程服务绑定的客户端代理和服务器端存根。
鉴于您需要呼叫和响应,绑定可能是更好的选择。但是请注意,除了使用 Parcelable
、Serializable
或将对象图转换为 JSON 之类的东西之外,没有任何 IPC 方法可以很好地支持 "complex objects"。
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 派生一个进程并创建服务实例(调用其 onCreate()
)方法。此时,行为与进程和服务已经 运行.
如果包含服务 A 的应用程序是系统应用程序,那么如何使用相同的证书对这两个应用程序进行签名?
您是否有权限获取平台证书?
无论如何,aidl 将是一个不错的选择,因为您需要服务 B 的响应。