优化电池使用以进行任务调度 API

此页面建议一些设置行为良好的后台任务的最佳实践。这些最佳实践专门针对减少电池消耗,但它们也可以通过其他方式(如减少网络使用)提高设备性能。

选择最佳约束并组合任务

为了最大程度地减少任务对设备的负载,指定 最佳约束 非常重要。(对于 JobScheduler 作业,请参阅 JobInfo.Builder 以了解约束列表。)例如,如果您想确保您的应用不会耗尽电池电量,最好指定 RequiresCharging 约束。此约束告诉系统,除非电池电量实际增加,否则不要运行该作业。类似地,使用 Wi-Fi 通常比移动数据消耗更少的电量,因此如果您的任务需要网络连接,但可以等到无计量网络可用时再运行,最好设置 NetworkType.UNMETERED 约束。

此外,如果您有多个类似的任务会落入相同的约束范围内,最好将它们组合成一个单一任务,这样设备只需唤醒一次。例如,假设您的应用有三个不同的数据集需要与云存储同步。与其安排三个不同的任务(每个数据集一个)——最好只安排一个“同步数据”任务,定义适当的约束,并让该任务在运行时执行所有挂起的 data 同步。

也就是说,您不应尝试将无关的任务组合成一个全能任务。相反,只需确保为每个任务指定适当的约束。例如,如果任务的优先级较低,请确保指定它们应在设备空闲且正在充电时运行。这样,即使设备唤醒了几次,也不会影响用户体验或电池续航时间。

仅在任务时间敏感时才将其标记为加急

如果任务特别紧急,您可以 将其标记为加急。(对于 JobScheduler 作业,请调用 JobInfo.Builder.setExpedited(true)。)这样做以多种方式优先处理任务。例如,系统会在可能的情况下立即运行这些任务,并且电源管理限制不太可能影响加急任务。

由于这些原因,您应该注意只在需要时才将任务标记为加急。由于加急任务可以覆盖某些系统效率,因此加急任务可能会比未被标记为加急任务时消耗更多的电量。

您应该只在任务时间敏感并且用户体验会因任务执行时间过长而受到损害时,才将其标记为加急。例如,如果您的应用运行任务来处理高优先级 FCM 消息,那么将该任务标记为加急是合理的。但是,您不应仅仅为了覆盖系统优化而将任务标记为加急。

检查您的任务为何停止

如果您的任务在完成之前停止,您可以通过调用 WorkInfo.getStopReason() 检查它们为何停止。(对于 JobScheduler 作业,请调用 JobParameters.getStopReason() 这样做很重要,原因有几个。首先,当然,您希望您的任务能够完成。找出任务停止的原因有助于您避免类似情况。但同时,系统很可能因为过度使用系统资源的行为而停止任务。您不希望您的应用成为一个不良公民,不必要地使用电池或网络。

例如,如果您的任务经常因 STOP_REASON_TIMEOUT 原因而停止,则可能存在某些边缘情况会导致您的任务花费比预期长得多的时间。

我们建议您使用分析引擎来跟踪您的应用的任务是否停止以及停止的原因。