Android 12 - 前台服务启动限制

jer*_*cob 24 android android-service foregroundnotification android-workmanager android-12

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

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

我试图从后台启动服务,下面的异常抛出。

ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

小智 8

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

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


nir*_*997 6

早些时候我们用来Service运行后台任务。但是,由于Android 12 - Foreground service launch restrictions,我们将无法调用Service来执行 Android 12+ 的后台任务。

所以从现在开始,从targetSdk 31开始,Service只有当应用程序位于前台时才能调用。当应用程序关闭或应用程序转到后台时,调用ServiceusingstartForegroundService将导致ForegroundServiceStartNotAllowedException.

因此,要执行后台任务,我们需要使用Worker而不是Service. 请参考这个答案以了解它是如何实现的。希望能帮助到你。另外,请参阅以下链接以获取需要进行哪些更改的高级概述。

  1. Android 12 行为变更

  2. 工作要求

  • @niranj1997 虽然这对于许多应用程序来说可能是一个合适的解决方法,但有时 Worker 不合适(例如长时间运行的不确定任务,例如跟踪运行)。不管怎样,谷歌记录了豁免,但却忽略了它们。这显然是 Android 12 中的一个错误,从后台启动服务的唯一方法是将目标设置为 30。 (3认同)