后台任务概览

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

本文档介绍了您可以使用的不同选项,并帮助您选择适合自己情况的选项。

术语

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

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

在本文档中,我们将使用“任务”一词来指代应用在主工作流之外执行的操作。为了确保在理解上保持一致,我们已将其分为三类主要任务类型:异步工作任务调度 API前台服务

选择合适的选项

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

如果您仍然不确定,可以使用我们提供的流程图,其中可以让您的决策更加细致。本文档后面部分将更详细地介绍以上各个选项。

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

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

异步工作

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

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

任务调度 API

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

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

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

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

前台服务

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

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

替代 API

该系统提供了一些备选 API,旨在针对更具体的用例提升性能。如果存在适用于您的用例的替代 API,我们建议您使用该 API 而非前台服务,因为这有助于提升应用的性能。前台服务类型文档会注明何时有合适的替代 API 可以用来代替特定的前台服务类型。

下面是使用替代 API 的一些最常见场景:

用户启动的任务

展示如何选择合适的 API 的流程图。此图表汇总了“用户发起的任务”部分中的材料。
图 1:如何选择正确的 API 来运行用户发起的后台任务。

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

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

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

如果任务被延迟或中断,是否会导致糟糕的用户体验?

请务必考虑,如果任务推迟或取消,用户体验是否会受到影响。例如,如果应用需要更新其资源,用户可能无法注意到操作是立即发生,还是在设备充电的午夜时分发生。在这种情况下,您应该使用后台工作选项。

这是一项简短的关键任务吗?

如果任务无法延迟并且将很快完成,您可以使用 shortService 类型的前台服务。这些服务比其他前台服务更容易创建,并且不需要那么多权限。但是,短期服务必须在三分钟内完成。

有没有专用于此用途的替代 API?

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

不过,由于前台服务可能会使用大量设备资源,因此系统会对使用时间和方式施加很多限制。在许多情况下,您可以不使用前台服务,而使用替代 API 来为您处理作业,而且不会造成任何问题。例如,如果您的应用需要在用户到达特定位置时执行操作,最好的选择是使用 Geofence API,而不是使用前台服务跟踪用户位置。

为响应事件而执行的任务

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

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

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

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

如果任务用时超过几秒钟,启动前台服务来处理任务可能比较合适。实际上,即使您的应用当前在后台运行,如果任务是由用户触发的,并且属于已获批准的后台启动限制豁免之一,那么即使您的应用当前在后台运行,也可能允许启动前台服务。例如,如果应用收到高优先级 FCM 消息,则即使该应用在后台运行,也能启动前台服务。

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