后台任务概览

应用通常需要同时执行多项操作。Android API 提供了许多不同的方法来实现此目的。选择合适的选项非常重要;某个选项可能适用于一种情况,但不适用于另一种情况。选择错误的 API 可能会影响应用的性能或资源效率,从而耗尽电池电量并降低用户设备的整体性能。在某些情况下,如果选择错误的方法,可能会导致您的应用无法在 Play 商店中上架。

本文档介绍了可供您选择的不同方案,并帮助您根据自己的情况选择合适的方案。

术语

与后台任务相关的一些重要术语可能会以多种相互矛盾的方式使用。因此,请务必定义我们的术语。

如果应用在后台运行,系统会对其施加多项限制。(例如,在大多数情况下,后台应用无法启动前台服务。)

在本文档中,我们将使用“任务”一词来表示应用在其主要工作流之外执行的操作。为确保大家对此有一致的理解,我们将其分为三类任务类型:异步工作任务调度 API前台服务

选择合适的选项

在大多数情况下,您可以通过确定任务所属的类别(异步工作任务调度 API前台服务)来确定适合任务使用的 API。

如果您仍不确定,可以使用我们提供的流程图,从而更细致地做出决定。本文档的后面部分将更详细地介绍这些选项。

对于后台任务,您需要考虑以下两种主要场景:

这两种场景各有自己的决策树。

异步工作

在许多情况下,应用只需在前台运行时执行并发操作。例如,应用可能需要执行一项耗时的计算。如果它在界面线程上执行计算,则用户在计算完成之前将无法与应用互动;这可能会导致 ANR 错误。在这种情况下,应用应使用异步工作选项。

常见的异步工作选项包括 Kotlin 协程和 Java 线程;如需了解详情,请参阅异步工作文档。请务必注意,与后台任务 API 不同,如果应用不再处于有效的生命周期阶段(例如,应用离开前台),我们无法保证异步工作会完成。

任务调度 API

如果您需要执行即使用户离开应用也需要继续执行的任务,任务调度 API 是一种更灵活的选择。在大多数情况下,运行后台任务的最佳方案是使用 WorkManager,但在某些情况下,使用平台 JobScheduler API 可能更合适。

WorkManager 是一个强大的库,可让您根据需要设置简单或复杂的工作。您可以使用 WorkManager 调度任务在特定时间运行,或指定任务应在何种情况下运行。您甚至可以设置任务链,以便每项任务依次运行,并将其结果传递给下一项任务。如需了解所有可用选项,请参阅 WorkManager 功能列表

后台任务的一些常见场景包括:

  • 定期从服务器提取数据
  • 提取传感器数据(例如计步器数据)
  • 获取定期位置数据(您必须在 Android 10 或更高版本中获得 ACCESS_BACKGROUND_LOCATION 权限)
  • 根据内容触发器(例如相机创建的照片)上传内容

前台服务

前台服务提供了一种强大的方法,可立即运行不应中断的任务。不过,前台服务可能会给设备带来较大负载,有时还会影响隐私和安全。出于这些原因,系统对应用如何以及何时可以使用前台服务施加了许多限制。例如,前台服务必须对用户可见,并且在大多数情况下,当应用在后台运行时无法启动前台服务。如需了解详情,请参阅前台服务文档

创建前台服务的方法有两种。您可以声明自己的 Service,并通过调用 Service.startForeground() 指定该服务是前台服务。或者,您也可以使用 WorkManager 创建前台服务,如对长时间运行的工作器的支持中所述。不过,请务必注意,由 WorkManager 创建的前台服务必须遵守与任何其他前台服务相同的所有限制。WorkManager 只是提供了一些便捷 API,以简化前台服务的创建。

备选 API

系统提供了一些替代 API,这些 API 专为在更具体的用例中提供更好的性能而设计。如果您的用例有替代 API,我们建议您使用该 API 而非前台服务,因为这应该有助于提升应用的性能。前台服务类型文档会说明何时有适合替代特定前台服务类型的替代 API。

使用替代 API 的一些最常见场景包括:

由用户发起的任务

显示如何选择适当 API 的流程图。此图表总结了“用户发起的任务”部分的内容。
图 1:如何选择合适的 API 来运行用户发起的后台任务。

如果应用需要执行后台任务,并且操作是在应用可见时由用户发起的,请回答以下问题以找到合适的方法。

任务是否需要在应用处于后台时继续运行?

如果任务在应用处于后台运行时不需要继续运行,您应使用异步工作。有许多方法可用于执行异步工作。请务必注意,如果应用进入后台,这些选项都会停止运行。(如果应用关闭,它们也会停止。)例如,社交媒体应用可能需要刷新其内容 Feed,但如果用户离开了屏幕,则无需完成该操作。

如果任务被推迟或中断,用户体验会不会受到影响?

请务必考虑推迟或取消任务是否会损害用户体验。例如,如果应用需要更新其资源,用户可能不会注意到该操作是立即进行还是在设备充电的深夜进行。在这种情况下,您应使用后台工作选项。

这项任务是否很重要且时间紧迫?

如果任务无法延迟且会快速完成,您可以使用类型为 shortService前台服务。与其他前台服务相比,这些服务更易于创建,并且不需要那么多的权限。不过,短时服务必须在三分钟内完成。

是否有专门用于此用途的替代 API?

如果任务对用户而言并非不可见,正确的解决方案可能是使用前台服务。这些服务一经启动便会持续运行,因此,如果中断任务会导致用户体验不佳,则这些服务是不错的选择。例如,锻炼跟踪应用可能会使用位置传感器,让用户在地图上记录其慢跑路线。您不应使用后台工作选项执行此操作,因为如果任务被暂停,跟踪会立即停止。在这种情况下,前台服务最为合适。

不过,由于前台服务可能会使用大量设备资源,因此系统对其使用时间和方式施加了许多限制。在许多情况下,您可以使用替代 API 来处理作业,而无需使用前台服务,这样可以减少麻烦。例如,如果您的应用需要在用户到达某个位置时执行操作,最佳做法是使用地理围栏 API,而不是使用前台服务跟踪用户的位置信息。

对事件做出响应的任务

显示如何选择适当 API 的流程图。此图表总结了“响应事件的任务”部分中的内容。
图 2:如何选择合适的 API 来运行事件触发的后台任务。

有时,应用需要执行后台工作来响应触发器,例如:

这可能是一个外部触发器(例如 FCM 消息),也可能是响应应用本身设置的闹钟。例如,游戏可能会收到 FCM 消息,告知其更新某些资源。

如果您可以确定任务会在几秒钟内完成,请使用异步工作来执行任务。系统会允许您的应用执行任何此类任务几秒钟,即使您的应用在后台运行也是如此。

如果任务需要的时间超过几秒钟,则可能需要启动前台服务来处理任务。事实上,即使您的应用目前在后台运行,如果任务由用户触发且属于已获批准的后台启动限制豁免情况之一,系统也可能会允许该应用启动前台服务。例如,如果应用收到高优先级 FCM 消息,即使应用在后台运行,也允许其启动前台服务。

如果任务需要的时间超过几秒钟,请使用任务调度 API