2016-06-13 95 views
1

形势的两个服务之间的通信:安卓:两个独立的APK

我有一个应该一个Service一个Android 系统应用(永久)来运行所有的时间。 (我们称之为服务A)

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

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

我尽力去完成

该服务的监听事件是什么。当接收到一个事件,然后我希望该服务的调用正常应用(服务B)这应该给一个响应返回给服务A.

途径让两个服务进行通信

我可以让他们沟通使用:

  • 结合(使用AIDL)
  • 消息(但不是最佳的,因为经过复杂的对象是必须的)

问题

  • 哪种沟通方式是“最好的”我为所描述的情况?
  • 当服务A想要委托/发送消息给服务B并且服务B未运行时会发生什么?它必须得到来自服务B的响应。如果服务A想要调用服务B,它是否应该始终启动服务B?

谢谢!

+0

的响应,如果你想快速和复杂的数据传递见[这里](http://stackoverflow.com/a/33688843/2252830) – pskink

回答

2

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

您只能引用两个选项,因为“Aidl”和“Binding”是相同的东西。您使用AIDL来描述和实现用于跨进程服务绑定的客户端代理和服务器端存根。

鉴于您需要呼叫和响应,绑定可能是更好的选择。但请注意,除了使用Parcelable,Serializable或将对象图转换为JSON之外,没有IPC方法可以很好地支持“复杂对象”。

当服务A想要委托/发送消息到服务B和服务B没有运行时会发生什么?

当调用startService()bindService(),机器人叉子应用B的过程,并创建该服务(调用其onCreate())方法的一个实例。此时,行为与流程和服务已经运行一样。

+0

非常感谢您提供丰富的答案 - 我很感激!所以你会绑定服务并使用AIDL来描述API? – sjkm

+0

@sjkm:是的。如果你想要一个同步响应,就像普通的方法调用一样,你的AIDL接口定义一个方法的返回值。如果需要异步响应,请为服务B和将从A传递的回调对象定义AIDL。然后,在AIDL定义的方法中传递回调对象的实例,并且B可以使用它来调用方法在A的回调中提供异步结果。有关回调方法的示例,请参见[示例应用程序](https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Callback)。 – CommonsWare

+0

谢谢!这看起来不错。明天我会更深入地研究它。祝你有个愉快的夜晚。 – sjkm

0

如果包含服务A的应用程序是系统应用程序,那么这两个应用程序如何使用相同的证书进行签名?

您是否有权访问平台证书?

不管怎么说AIDL将是一个不错的选择,因为你想从服务B.

+0

您不需要使用平台证书签署应用程序,以使其成为系统应用程序。它只需要安装在“/ system/app”/“system/priv-app”文件夹中...... – sjkm