Android 12 - 前台服务启动限制
Android 12 - Foreground service launch restrictions
我正在开发一个需要从后台startForeground服务的SDK。因为它使用了后台定位和蓝牙相关的工作。如果应用程序被终止,则监视在后台执行。这就是我使用前台服务的原因。有条件从后台启动前台服务。
目前,我的SDK使用Service to handle this job. But Android 12 on-words it doesn't support to start service from the background.
我正在尝试从后台启动服务,但抛出了以下异常。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
如何使用 WorkManager to fix this issue, all my handling is done by the Service class and how can I pass the Service object to Worker class 并在 Worker class.
中启动此作业
其实我的项目是基于beacon技术的。
并且信标信号用于向用户显示不同的推荐。
在我目前的实现中,如果应用程序被用户杀死,
并且也接受前台服务,SDK会在后台运行。
并检测信标并提供适当的操作。
我的实现是,如果应用程序使用前台服务“OFF”初始化我的 SDK
然后稍后,当应用程序在后台并尝试从后台启动前台服务时,会抛出此异常。
与前台服务相关的决策由服务器端持有 API。我会定期检查服务器端值是否更改,如果值更改,更改的操作会反映在 SDK 中。
世界上没有人可以给你答案。所有这些限制的想法是,我们作为开发人员需要优化我们的应用程序。因此,如果这对您来说不可能,那很可能意味着您需要优化您的工作方式。为此,您需要提供更多信息,了解您收到的确切事件、您的用例等。
如您所见,有关于例外的信息:
您的应用收到需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。
但是您的问题中没有任何内容表明您的用例可能与此相关。
此外,我不明白该应用程序是如何被杀死的,但您仍在后台工作。
此外,如果您想不断做某事 - 为什么当您处于后台时会发生事件。就在用户打开应用程序时 - 启动服务并继续运行。
您也可以“破解”它并要求用户将您从电池优化中移除。
根据官方docs,如果您的应用程序执行以下操作之一,它应该能够启动 FGS:
Your app receives a Bluetooth broadcast that requires the BLUETOOTH_CONNECT or BLUETOOTH_SCAN permissions.
或
Your app receives an event that's related to geofencing or activity recognition transition.
对于您的用例,这两个似乎是非常好的候选者,至少我是这样理解的。
之前我们使用 Service
到 运行 后台任务。但是,由于 Android 12 - Foreground service launch restrictions
,我们将无法调用 Service
来执行 Android 12+ 的后台任务。
所以从现在开始,从targetSdk 31开始,Service
只能在应用程序在前台时调用。当应用程序关闭或应用程序进入后台时,使用 startForegroundService
调用 Service
将导致 ForegroundServiceStartNotAllowedException
.
所以要执行后台任务,我们需要使用Worker
而不是Service
。请参考此 以了解其实现方式。希望能帮助到你。此外,请参阅以下链接以了解需要进行哪些更改的 high-level 概览。
我正在开发一个需要从后台startForeground服务的SDK。因为它使用了后台定位和蓝牙相关的工作。如果应用程序被终止,则监视在后台执行。这就是我使用前台服务的原因。有条件从后台启动前台服务。
目前,我的SDK使用Service to handle this job. But Android 12 on-words it doesn't support to start service from the background.
我正在尝试从后台启动服务,但抛出了以下异常。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
如何使用 WorkManager to fix this issue, all my handling is done by the Service class and how can I pass the Service object to Worker class 并在 Worker class.
中启动此作业其实我的项目是基于beacon技术的。 并且信标信号用于向用户显示不同的推荐。
在我目前的实现中,如果应用程序被用户杀死, 并且也接受前台服务,SDK会在后台运行。 并检测信标并提供适当的操作。
我的实现是,如果应用程序使用前台服务“OFF”初始化我的 SDK 然后稍后,当应用程序在后台并尝试从后台启动前台服务时,会抛出此异常。 与前台服务相关的决策由服务器端持有 API。我会定期检查服务器端值是否更改,如果值更改,更改的操作会反映在 SDK 中。
世界上没有人可以给你答案。所有这些限制的想法是,我们作为开发人员需要优化我们的应用程序。因此,如果这对您来说不可能,那很可能意味着您需要优化您的工作方式。为此,您需要提供更多信息,了解您收到的确切事件、您的用例等。
如您所见,有关于例外的信息:
您的应用收到需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。
但是您的问题中没有任何内容表明您的用例可能与此相关。
此外,我不明白该应用程序是如何被杀死的,但您仍在后台工作。
此外,如果您想不断做某事 - 为什么当您处于后台时会发生事件。就在用户打开应用程序时 - 启动服务并继续运行。
您也可以“破解”它并要求用户将您从电池优化中移除。
根据官方docs,如果您的应用程序执行以下操作之一,它应该能够启动 FGS:
Your app receives a Bluetooth broadcast that requires the BLUETOOTH_CONNECT or BLUETOOTH_SCAN permissions.
或
Your app receives an event that's related to geofencing or activity recognition transition.
对于您的用例,这两个似乎是非常好的候选者,至少我是这样理解的。
之前我们使用 Service
到 运行 后台任务。但是,由于 Android 12 - Foreground service launch restrictions
,我们将无法调用 Service
来执行 Android 12+ 的后台任务。
所以从现在开始,从targetSdk 31开始,Service
只能在应用程序在前台时调用。当应用程序关闭或应用程序进入后台时,使用 startForegroundService
调用 Service
将导致 ForegroundServiceStartNotAllowedException
.
所以要执行后台任务,我们需要使用Worker
而不是Service
。请参考此