如何 运行 库中的单例(共享)服务用于多个应用程序?
How to run a singleton (shared) service in a library for multiple applications?
我编写了一个在后台启动服务的库。它在所有应用程序中都能完美运行。
为了减少 RAM 使用,我想避免 运行 为不同的应用程序提供多个服务。其实只用一个服务就够了。
首先,我编写了一个 AIDL 文件来实现 applications/libraries 之间的 IPC。将服务定义为 exported/enabled 并具有签名权限。由于所有应用程序都是完全相同的服务,因此无法检查任何应用程序是否启动或关闭。在绑定服务以检查服务的条件时,由于 BIND_AUTO_CREATE 标志的性质,它总是创建和销毁自己的服务。这就是为什么无法从导出的服务中获取任何类型的信息,如果它真的启动并且运行。
然后,我尝试为库的清单定义一个Content Provider。我的目标是通过它共享服务信息。这是在导出服务和应用程序主进程之间进行通信的非常好的机制。但它不适用于多个实例。因为从库中获取内容提供者信息的应用程序使用相同的权限,所以不可能安装第二个。它给出了 DUPLICATE_PROVIDER_AUTHORITY 错误。
你对这个问题有什么建议?是否有创建 master/slave 机制的选项?是否可以使应用程序的服务单例使用库项目?
P.S:尝试了广播和共享首选项技术。但是他们无法有效地监听导出服务的回调。
您需要将 Service
放入其自己的 APK 中。它需要有自己唯一的包名称(在清单中),该名称不同于使用它的任何应用程序的包名称。这就是让 Service
表现得像单例的方法。现在您可以使用 AIDL 并绑定到 Service
以便进行双向通信。
请注意,在 Android 的较新版本中,有必要使用 explicit Intent
启动 Service
(即: Component
必须明确指定,不能只使用一个 ACTION)。
备选方案 1:
- 如果用例允许,我认为您不应该实施该服务。
让您的客户实现一项服务,调用您的库代码。这个
这就是 MediaPlayer 和其他默认 android API 的工作方式。
备选方案 2:
- 在单独的应用程序中托管服务..并在
第一个电话来自任何客户。从这里开始会有
处理所有客户端的单一服务 request.This 是一些像 adobe 这样的 API
Airwatch 的 air/ MDM 解决方案有效。
没有什么好的方法可以控制其他应用程序中 运行 的组件,除非使用广播接收器和所有。
我编写了一个在后台启动服务的库。它在所有应用程序中都能完美运行。
为了减少 RAM 使用,我想避免 运行 为不同的应用程序提供多个服务。其实只用一个服务就够了。
首先,我编写了一个 AIDL 文件来实现 applications/libraries 之间的 IPC。将服务定义为 exported/enabled 并具有签名权限。由于所有应用程序都是完全相同的服务,因此无法检查任何应用程序是否启动或关闭。在绑定服务以检查服务的条件时,由于 BIND_AUTO_CREATE 标志的性质,它总是创建和销毁自己的服务。这就是为什么无法从导出的服务中获取任何类型的信息,如果它真的启动并且运行。
然后,我尝试为库的清单定义一个Content Provider。我的目标是通过它共享服务信息。这是在导出服务和应用程序主进程之间进行通信的非常好的机制。但它不适用于多个实例。因为从库中获取内容提供者信息的应用程序使用相同的权限,所以不可能安装第二个。它给出了 DUPLICATE_PROVIDER_AUTHORITY 错误。
你对这个问题有什么建议?是否有创建 master/slave 机制的选项?是否可以使应用程序的服务单例使用库项目?
P.S:尝试了广播和共享首选项技术。但是他们无法有效地监听导出服务的回调。
您需要将 Service
放入其自己的 APK 中。它需要有自己唯一的包名称(在清单中),该名称不同于使用它的任何应用程序的包名称。这就是让 Service
表现得像单例的方法。现在您可以使用 AIDL 并绑定到 Service
以便进行双向通信。
请注意,在 Android 的较新版本中,有必要使用 explicit Intent
启动 Service
(即: Component
必须明确指定,不能只使用一个 ACTION)。
备选方案 1:
- 如果用例允许,我认为您不应该实施该服务。 让您的客户实现一项服务,调用您的库代码。这个 这就是 MediaPlayer 和其他默认 android API 的工作方式。
备选方案 2:
- 在单独的应用程序中托管服务..并在 第一个电话来自任何客户。从这里开始会有 处理所有客户端的单一服务 request.This 是一些像 adobe 这样的 API Airwatch 的 air/ MDM 解决方案有效。
没有什么好的方法可以控制其他应用程序中 运行 的组件,除非使用广播接收器和所有。