前台服务启动限制
以 Android 12 为目标平台的应用在后台运行时无法再启动前台服务,但一些特殊情况除外。如果应用在后台运行时尝试启动前台服务,并且前台服务不符合任何特殊情况,则系统会抛出 IllegalStateException
。
前台服务的推荐替代方案:WorkManager
如果您的应用受到此变更的影响,建议您转向使用 WorkManager。Android 12 Beta 版发布时,WorkManager 将成为启动高优先级后台任务的推荐解决方案。
Work Manager 2.7.0-alpha01 支持加急作业,后者是 Android 12 中的一种新作业。在 Android 11 及更低版本中,此版本的 WorkManager 使用前台服务提供向后兼容性。
如需查看 Work Manager 2.7.0-alpha01 如何使用加急作业的完整示例,请查看 GitHub 上的 WorkManagerSample。
加急作业
Android 12 新推出的加急作业允许应用执行重要任务,同时使系统能够更好地控制对资源的访问权限。 加急作业在前台服务和 JobScheduler
作业之间具有一组特征:
- 它们不受某些系统电源管理限制(包括省电模式和低电耗模式)的影响。
- 只要系统的当前工作负载允许,系统就会立即运行这些作业。
加急作业可能会延迟
系统会尝试在调用指定的加急作业后,尽快执行该作业。但与其他类型的作业一样,如果正在运行的作业过多或系统资源不足,系统可能会延迟启动新的加急作业。
具体而言,当至少发生以下任一情况时,系统就会推迟执行加急作业:
- 系统负载过高。
- 已超出加急作业配额限制。加急作业使用基于应用待机存储分区的配额系统,并限制滚动时间窗口中的最大执行时间。用于加急作业的配额比用于其他类型的后台作业的配额限制更大。
WorkManager 更新
从 WorkManager 2.7.0-alpha01 开始,您的应用可以调用 setExpedited()
来声明 Worker
应该加急处理。在 Android 12 上运行时,这个新 API 使用了加急作业,并在早期 Android 版本中使用了前台服务。
为了鼓励开发者在其应用中请求加急作业时进行有意识的考量,并更好地支持可以延长任务运行时间的功能,现已弃用 CoroutineWorker.setForeground()
和 ListenableWorker.setForegroundAsync()
方法。特别是在运行 Android 12 的设备上,尝试调用 ListenableWorker.setForegroundAsync()
会导致 IllegalStateException
。建议开发者改为使用 setExpedited()
。
允许从后台启动前台服务的情况
在以下情况下,即使您的应用在后台运行,也可以启动前台服务:
- 您的应用从某种用户可见的状态,例如某种 activity,过渡至其他状态。
- 您的应用使用 Firebase Cloud Messaging 接收一条高优先级消息。
- 用户对与应用相关的界面元素执行操作。例如,他们可能与气泡、通知、微件或 activity 互动。
- 您的应用收到与地理围栏或运动状态识别相关的事件。
- 设备重新启动并在广播接收器中接收了
ACTION_BOOT_COMPLETED
intent 操作之后。 - 应用包含特定系统角色或权限,例如设备所有者和配置文件所有者。
- 您的应用使用 Companion Device Manager。
-
您的应用已请求
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
权限,并将用户导向至用户已在其中停用该应用的电池优化功能的设置页面。如需将用户引导至系统设置中的电池优化页面,请调用包含
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent 操作的 intent。在该页面上,当用户关闭应用的电池优化功能后,系统将显示图 1 所示的对话框。 -
应用满足限制从后台启动 activity 的例外情况中所述的任何条件,但应用在现有任务的返回堆栈中具有 activity 的情况除外。