安卓手机APP开发___后台任务概述
目录
[任务调度 API](#任务调度 API)
[替代 API](#替代 API)
[有没有专用于此用途的替代 API?](#有没有专用于此用途的替代 API?)
概述
应用通常需要同时执行多项操作。Android API 提供了多种不同的方
法来实现这一点。选择合适的选项非常重要;一个选项可能适用于一
种情况,但不适用于另一种情况。选择错误的 API 可能会影响应用的
性能或资源效率,这可能会消耗电池电量,还会降低用户设备的整体性
能。在某些情况下,选择错误的方法可能会导致您的应用无法在 Play
商店上架。
本文档介绍了您可以使用的不同选项,并帮助您选择适合自己情况的选项。
术语
与后台任务相关的一些重要术语可能以多种相互矛盾的方式使用。因此,
定义术语非常重要。
关键术语 :如果应用的任何 activity 对用户不可见,并且该应用没有
运行任何前台服务,则表示应用在后台运行。
如果应用在后台运行,系统会对其施加一些限制。(例如,在大多数情况
下,后台应用无法启动前台服务)。
在本文档中,我们将使用"任务"一词来指代应用在主工作流之外执行的操作。
为了确保在理解上保持一致,我们已将其分为三类主要任务类型:异步工作、
任务调度 API 和前台服务。
选择合适的选项
在大多数情况下,您可以通过确定任务所属的类别(异步工作、任务调度
API 或前台服务)来找出适合您的任务的 API。
如果您仍然不确定,可以使用我们提供的流程图,其中可以让您的决策更
加细致。本文档后面部分将更详细地介绍以上各个选项。
注意 :在大多数情况下,运行后台任务的最佳选择是使用 WorkManager。
不过,在某些情况下,另一种选择更好。本页将帮助您了解哪种解决方案
最符合您的需求。
对于后台任务,需要考虑两种主要场景:
用户在应用可见时启动的任务
任务为响应内部或外部事件而启动
这两种场景都有自己的决策树。
异步工作
在许多情况下,应用在前台运行时只需执行并发操作。例如,应用可能需
要进行一项耗时的计算。如果是在界面线程上执行计算,那么在计算完成
之前,用户将无法与应用互动;这可能会导致 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 的一些最常见场景:
使用用户发起的数据传输执行大量下载或上传,而不是创建数据同步前台服务
使用配套设备管理器进行蓝牙配对和数据传输,而不是使用已连接的设备前台服务
使用画中画模式播放视频,而不是创建媒体播放前台服务
用户启动的任务
如果应用需要执行后台任务,并且操作是在应用可见时由用户发起的,请回
答这些问题以找到正确的方法。
当应用在后台运行时,任务是否需要继续运行?
如果应用在后台运行时不需要继续运行任务,您应使用异步工作。有多种用于
执行异步工作的选项。请务必注意,如果应用在后台运行,这些选项都将停
止运行。(如果应用关闭,它们也会停止运行)。例如,社交媒体应用可能
想要刷新其内容 Feed,但如果用户离开了屏幕,则无需完成相应操作。
如果任务被延迟或中断,是否会导致糟糕的用户体验?
请务必考虑,如果任务推迟或取消,用户体验是否会受到影响。例如,如果应
用需要更新其资源,用户可能无法注意到操作是立即发生,还是在设备充电的
午夜时分发生。在这种情况下,您应该使用后台工作选项。
注意 :如果后台工作任务的完成时间超过 10 分钟,则很有可能会中断。您
应该尝试设法将此类任务拆分为更小的子任务。如果您需要创建长时间运行的
任务,但无法将其拆分为子任务,并且您不希望任务中断,则前台服务可能是
最佳选择。
这是一项简短的关键任务吗?
如果任务无法延迟并且将很快完成,您可以使用 shortService 类型的前台服务。
这些服务比其他前台服务更容易创建,并且不需要那么多权限。但是,短期服
务必须在三分钟内完成。
注意 :从 Android 12 开始,大多数前台服务只有在运行 10 秒后才会向用户
显示通知。
有没有专用于此用途的替代 API?
如果任务对用户不可见,正确的解决方案可能是使用前台服务。这些服务
在启动后会持续运行,因此如果中断任务会给用户带来糟糕的体验,那么
使用这些服务是不错的选择。例如,锻炼跟踪应用可能会使用位置传感器
来让用户在地图上记录其慢跑路线。您不能使用后台工作选项来执行此操
作,因为如果任务暂停,跟踪会立即停止。在这种情况下,前台服务最合适。
不过,由于前台服务可能会使用大量设备资源,因此系统会对使用时间和方
式施加很多限制。在许多情况下,您可以不使用前台服务,而使用替代 API
来为您处理作业,而且不会造成任何问题。例如,如果您的应用需要在用户
到达特定位置时执行操作,最好的选择是使用 Geofence API,而不是使用
前台服务跟踪用户位置。
为响应事件而执行的任务
有时,应用需要执行后台工作来响应触发器,例如:
广播消息
Firebase Cloud Messaging (FCM) 消息
由应用设置的闹钟
这可能是外部触发器(例如 FCM 消息),也可能是在响应应用本身设置的闹钟。
例如,游戏可能会收到一条 FCM 消息,告知它更新一些资源。
如果您确定任务将在几秒钟内完成,请使用异步工作来执行该任务。系统将允
许您的应用等待几秒钟时间来执行任何此类任务,即使您的应用在后台运行也
是如此。
如果任务用时超过几秒钟,启动前台服务来处理任务可能比较合适。实际上,
即使您的应用当前在后台运行,如果任务是由用户触发的,并且属于已获批准
的后台启动限制豁免之一,那么即使您的应用当前在后台运行,也可能允许
启动前台服务。例如,如果应用收到高优先级 FCM 消息,则即使该应用在
后台运行,也能启动前台服务。
如果任务花费的时间超过几秒钟,请使用任务调度 API。