5

我正在开发一个需要从后台启动前台服务的 SDK。因为它使用后台定位和蓝牙相关的作品。如果应用程序被杀死,则监控在后台执行。这就是我使用前台服务的原因。有一个条件是从后台启动前台服务。

目前,我的 SDK 使用Service来处理这项工作。但是Android 12 on-words 不支持从后台启动服务。

我正在尝试从引发以下异常的后台启动服务。

ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false

我如何使用WorkManager 来解决这个问题,我的所有处理都由 Service 类完成,我如何将 Service 对象传递给Worker类并在 Worker 类中启动这项工作。

实际上,我的项目是基于信标技术的。信标信号用于向用户展示不同的推荐。

在我目前的实现中,如果应用程序被用户杀死,并且还接受前台服务,SDK 将在后台运行。并检测信标并提供适当的操作。

我的实现是,如果应用程序使用前台服务“关闭”初始化我的 SDK,那么稍后,当应用程序处于后台并尝试从后台启动前台服务时,会抛出此异常。与前台服务相关的决策由服务器端 API 持有。我会定期检查服务器端值是否更改,如果值更改,则更改的操作会反映在 SDK 中。

4

2 回答 2

4

世界上没有人能给你答案。所有这些限制的想法是我们作为开发人员需要优化我们的应用程序。因此,如果这对您来说不可能,则意味着您很可能需要优化您的工作方式。为此,您需要提供有关您正在接收的确切事件、您的用例等的更多信息。

https://developer.android.com/about/versions/12/foreground-services#cases-fgs-background-starts-allowed

如您所见,有关于以下例外的信息:

您的应用接收需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。

但是您的问题中没有任何内容表明您的用例可能与此有关。

另外,我不明白应用程序是如何被杀死的,但你一直在后台工作。

另外,如果您想不断地做某事-为什么在后台时会发生事件。就在用户打开应用程序时 - 启动服务并继续运行。

您也可以“破解”它并要求用户将您从电池优化中删除。

https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases

于 2021-09-18T16:28:53.677 回答
1

根据官方文档,如果您的应用程序执行以下操作之一,它应该能够启动 FGS:

您的应用接收需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。

或者

您的应用收到与地理围栏或活动识别转换相关的事件。

这两个对于您的用例来说似乎是相当不错的候选人,至少我是如何理解的。

于 2021-11-05T22:09:08.180 回答