如何在库中为多个应用程序运行单件(共享)服务?

我写了一个在后台启动服务的库。 它在所有应用程序中运行完美。

为了减少RAM的使用,我想避免为不同的应用程序运行多个服务。 实际上,只使用一种服务来完成任务就足够了。

首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC。 使用签名权限将服务定义为导出/启用。 由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭。 绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建并销毁自己的服务。 这就是为什么不能从导出的服务获得任何types的信息,如果它真的启动并运行。

然后,我尝试将内容提供程序定义到库的清单中。 我的目标是通过它分享服务信息。 在导出的服务和应用程序主进程之间进行通信是非常好的机制。 但它不适用于多个实例。 因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个。 它给出了DUPLICATE_PROVIDER_AUTHORITY错误。

你对这个问题有什么建议? 有没有选项来创建主/从机制? 是否可以使应用程序的服务单例使用库项目?

PS:尝试广播和共享偏好技术。 但是他们无法从导出的服务中收听回调。

您需要将Service放在自己的APK中。 它需要有自己唯一的包名称(在清单中),这与使用它的任何应用程序的包名称不同。 这就是您使Service表现为单身人士的方式。 现在,您可以使用AIDL并绑定到Service ,以便进行双向通信。

请注意,在Android的更新版本中,必须使用显式 Intent启动Service (即:必须明确指定Component ,不能仅使用ACTION)。

备选方案1:

  • 如果用例允许,我认为您不应该实施该服务。 让您的客户实现服务,调用您的库代码。 这就是MediaPlayer和其他默认android API的工作方式。

备选方案2:

  • 在单独的应用程序中托管服务…并在从任何客户端进行第一次呼叫时下载应用程序。 从这里开始,将有单一服务处理所有客户请求。这就是一些API,如Airwatch的adobe air / MDM解决方案。

除非使用广播接收器,否则没有好的方法可以控制在其他应用程序中运行的组件。