优化任务调度 API 的电池用量

本页介绍了一些关于设置行为良好的后台任务的最佳实践。这些最佳实践专门旨在减少电池消耗,但也可以通过其他方式提高设备性能,例如减少网络使用。

选择最佳约束条件并组合任务

为了尽可能减少任务在设备上造成的负载,请务必指定最佳约束条件。(对于 JobScheduler 作业,请参阅 JobInfo.Builder 查看约束条件列表。)举个例子,如果您想确保应用不会耗尽电量,最好指定 RequiresCharging 约束条件。此约束条件告知系统,除非电池电量实际增加,否则不要运行作业。同样,使用 Wi-Fi 所需的功耗通常低于移动流量,因此,如果您的任务需要网络连接,但可以等到不按流量计费的网络可用时,最好设置 NetworkType.UNMETERED 限制条件。

此外,如果您有多个可能处于同一约束条件的类似任务,通常最好将它们组合到单个任务中,以便设备仅被唤醒一次。例如,假设您的应用有三个不同的数据集需要与云端存储空间同步。与安排三个不同的任务(每个数据集对应一个任务)不同,通常最好只安排单个“同步数据”任务,定义适当的约束,然后让该任务在运行时完成所有待处理的数据同步。

也就是说,您不应该尝试将不相关的任务组合为一项综合性任务。只需确保为每个任务提供适当的约束条件即可。例如,如果任务优先级较低,请务必指定任务应在设备空闲和充电时运行。这样,即使多次唤醒设备,也不会破坏用户体验或影响电池续航时间。

仅当任务具有时效性时,才将其标记为加急任务

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

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

只有当任务具有时效性时,才应标记为加急任务;如果执行任务需要更长时间,用户体验将会受到影响。例如,如果您的应用运行任务来处理高优先级 FCM 消息,则最好将该任务标记为加急任务。但是,您不应仅仅为了替换系统优化而将任务标记为加急。

查看您的任务停止的原因

如果任务在任务完成前停止,您可以通过调用 WorkInfo.getStopReason() 检查任务停止的原因。(对于 JobScheduler 作业,请调用 JobParameters.getStopReason()。这么做之所以重要,原因有很多。首先,你肯定希望完成任务。找出任务停止的原因有助于避免类似情况。此外,系统可能会因过度使用系统资源的行为而停止任务。您一定不想让自己的应用成为坏人,在不必要的情况下耗用电池或网络。

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

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