我写了一个在后台启动服务的库。 它在所有应用程序中运行完美。
为了减少RAM的使用,我想避免为不同的应用程序运行多个服务。 实际上,只使用一种服务来完成任务就足够了。
首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC。 使用签名权限将服务定义为导出/启用。 由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭。 绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建并销毁自己的服务。 这就是为什么不能从导出的服务获得任何types的信息,如果它真的启动并运行。
然后,我尝试将内容提供程序定义到库的清单中。 我的目标是通过它分享服务信息。 在导出的服务和应用程序主进程之间进行通信是非常好的机制。 但它不适用于多个实例。 因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个。 它给出了DUPLICATE_PROVIDER_AUTHORITY错误。
你对这个问题有什么建议? 有没有选项来创建主/从机制? 是否可以使应用程序的服务单例使用库项目?
PS:尝试广播和共享偏好技术。 但是他们无法从导出的服务中收听回调。
您需要将Service
放在自己的APK中。 它需要有自己唯一的包名称(在清单中),这与使用它的任何应用程序的包名称不同。 这就是您使Service
表现为单身人士的方式。 现在,您可以使用AIDL并绑定到Service
,以便进行双向通信。
请注意,在Android的更新版本中,必须使用显式 Intent
启动Service
(即:必须明确指定Component
,不能仅使用ACTION)。
备选方案1:
备选方案2:
除非使用广播接收器,否则没有好的方法可以控制在其他应用程序中运行的组件。