我正在开发一个需要后台startForeground服务的SDK。因为它使用背景定位和蓝牙相关的工作。如果应用程序被杀死,监视将在后台执行。所以我才用前台服务。有一个条件从后台启动前台服务。
目前,我的SDK使用服务来处理这项工作。但Android12on-word不支持从后台启动服务。
我试图从下面的异常抛出的背景开始服务。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
如何使用WorkManager解决此问题,所有处理都是由服务类完成的,以及如何将服务对象传递给工人类并在Worker类中启动此作业。
事实上,我的项目是基于信标技术。信标信号用于向用户显示不同的建议。
在我当前的实现中,如果应用程序被用户杀死,并且还接受前台服务,则SDK将在后台运行。并探测到信标并提供适当的行动。
我的实现是,如果应用程序用前台服务"OFF“初始化我的SDK,那么稍后当应用程序处于后台并试图从后台启动前台服务时,这个异常将抛出。前台服务相关的决策由服务器端API保存。我定期检查服务器端值是否被更改,如果值被更改,更改的操作将反映在SDK中。
发布于 2021-09-18 16:28:53
世界上没有人能给你答案。所有这些限制的想法是,作为开发人员,我们需要优化应用程序。所以,如果这对你来说是不可能的,那就意味着你很可能需要优化你的工作方式。要做到这一点,您需要提供更多的信息,具体您正在接收的事件,什么是您的用例,等等。
如您所见,有关于以下异常的信息:
您的应用程序接收需要BLUETOOTH_CONNECT或BLUETOOTH_SCAN权限的蓝牙广播。
但是在您的问题中并没有说您的用例可能与此相关。
另外,我不明白这个应用程序是如何被杀死的,但是你一直在后台工作。
另外,如果你想要不断地做一些事情,为什么会有一个事件,当你在后台。就在用户打开应用程序的时候--启动服务并继续运行。
你也可以“黑”它,让用户把你从电池优化中移除。。
发布于 2022-05-05 17:51:12
早些时候,我们使用Service
运行后台任务。但是,由于Android 12 - Foreground service launch restrictions
,我们将无法调用Service
来执行安卓12+的后台任务。
因此,从现在开始,从targetSdk 31开始,只有在应用程序处于前台时才能调用Service
。当应用程序关闭或应用程序转到后台时,使用Service
调用startForegroundService
将导致ForegroundServiceStartNotAllowedException
。
因此,要执行后台任务,我们需要使用Worker
而不是Service
。请参考这个回答来了解它是如何实现的。希望能帮上忙。另外,请参考下面的链接,以获得需要进行哪些更改的高级概述。
发布于 2021-11-05 22:09:08
根据官方的文档,如果你的应用程序做了以下之一,它应该能够启动一个FGS:
您的应用程序接收需要BLUETOOTH_CONNECT或BLUETOOTH_SCAN权限的蓝牙广播。
或
您的应用程序接收到与地理位置或活动识别转换相关的事件。
这两个人似乎是你用例的很好的候选者,至少我是怎么理解的。
https://stackoverflow.com/questions/69223128
复制相似问题