前台服务启动限制  

您所在的位置:网站首页 启动服务失败 前台服务启动限制  

前台服务启动限制  

2023-07-14 16:31| 来源: 网络整理| 查看: 265

以 Android 12 为目标平台的应用在后台运行时无法再启动前台服务,但一些特殊情况除外。如果应用在后台运行时尝试启动前台服务,并且前台服务不符合任何特殊情况,则系统会抛出 ForegroundServiceStartNotAllowedException。

注意:如果一个应用调用 Context.startForegroundService() 来启动另一个应用拥有的前台服务,只有在这两个应用都以 Android 12 为目标平台时,本页介绍的限制才会生效。 前台服务的推荐替代方案:WorkManager

如果您的应用受到此变更的影响,请改用 WorkManager。WorkManager 是启动优先级较高的后台任务的推荐解决方案。

从 WorkManager 2.7.0 开始,您的应用可以调用 setExpedited() 来声明 Worker 应使用加急作业。这一新 API 在 Android 12 上运行时使用加急作业,该 API 在早期 Android 版本中使用前台服务来提供向后兼容性。

以下代码段展示了关于如何使用 setExpedited() 方法的示例:

Kotlin OneTimeWorkRequestBuilder().apply { setInputData(inputData) setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) }.build() Java OneTimeWorkRequest request = new OneTimeWorkRequestBuilder() .setInputData(inputData) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) .build();

由于 CoroutineWorker.setForeground() 和 ListenableWorker.setForegroundAsync() 方法由前台服务提供支持,因此它们受到相同的前台服务启动限制和豁免。您可以适时地使用该 API,但如果系统不允许您的应用启动前台服务,您应准备好处理异常。为了获得更加一致的体验,请使用 setExpedited()。

如需查看关于 WorkManager 2.7.0 如何使用加急作业的完整示例,请查看 GitHub 上的 WorkManagerSample。

加急作业

Android 12 新推出的加急作业允许应用执行简短的重要任务,同时使系统能够更好地控制对资源的访问权限。这些作业具有一组介于前台服务和常规 JobScheduler 作业之间的特征:

它们适用于在几分钟内完成的简短任务。除非您的应用有足够的配额,否则如果某项加急作业已经运行了至少 3 分钟,系统可能会停止该作业。 它们不太受系统的某些电源管理限制(包括省电模式和低电耗模式)的影响。 只要系统的当前工作负载允许,系统就会立即运行这些作业。 加急作业可能会延迟

系统会尝试在调用指定的加急作业后,尽快执行该作业。不过,与其他类型的作业一样,系统可能会延迟启动新的加急作业,如在以下情况下:

系统负载过高,当有过多作业已在运行或者当系统内存不足时,就会发生这种情况。 已超出加急作业配额限制。加急作业使用基于应用待机存储分区的配额系统,并限制滚动时间窗口中的最大执行时间。用于加急作业的配额比用于其他类型的后台作业的配额限制更大。 对闹钟管理器 API 的影响

一般来说,以 Android 12 为目标平台的应用无法使用闹钟启动前台服务。

如需支持应用需要向用户发送对时间敏感的闹钟或提醒的用例,在精确的闹钟响过之后,您仍可启动前台服务。为了设置精确的闹钟,您的应用必须声明 SCHEDULE_EXACT_ALARM 权限。

详细了解精确的闹钟权限。

允许从后台启动前台服务的情况

在以下情况下,即使您的应用在后台运行,也可以启动前台服务:

您的应用从用户可见的某种状态(如 activity)过渡。 您的应用可以从后台启动 activity,但该应用在现有任务的返回堆栈中具有 activity 的情况除外。 您的应用使用 Firebase Cloud Messaging 接收高优先级消息。 用户对与您的应用相关的界面元素执行操作。例如,他们可能与气泡、通知、微件或 activity 互动。 您的应用收到与地理围栏或运动状态识别过渡相关的事件。 设备重新启动并在广播接收器中接收 ACTION_BOOT_COMPLETED、ACTION_LOCKED_BOOT_COMPLETED 或 ACTION_MY_PACKAGE_REPLACED intent 操作之后。 您的应用在广播接收器中接收 ACTION_TIMEZONE_CHANGED、ACTION_TIME_CHANGED 或 ACTION_LOCALE_CHANGED intent 操作。 您的应用接收需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。 应用包含特定系统角色或权限,例如设备所有者和配置文件所有者。

您的应用使用配套设备管理器。

为了每当配套设备在附近时都让系统唤醒您的应用,请在 Android 12 中实现配套设备服务。

系统重启“粘性”前台服务。为使前台服务具有粘性,请从 onStartCommand() 返回 START_STICKY 或 START_REDELIVER_INTENT。

用户为您的应用关闭了电池优化。您可以将用户引导至您的应用在系统设置中的应用信息页面,帮助用户找到此选项。为此,请调用包含 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS intent 操作的 intent。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3