此页面建议一些设置行为良好的后台任务的最佳实践。这些最佳实践特别旨在降低电池消耗,但它们也可以通过其他方式提高设备性能,例如减少网络使用。
选择最佳约束并组合任务
为了最大限度地减少任务对设备的负载,务必指定最佳约束。(对于 JobScheduler 作业,请参阅 JobInfo.Builder
以获取约束列表。)举一个例子,如果您想确保您的应用不会耗尽电池电量,最好指定 RequiresCharging
约束。此约束告诉系统除非电池电量实际增加,否则不要运行该作业。同样,使用 Wi-Fi 通常比移动数据消耗更少的电量,因此,如果您的任务需要网络连接但可以等到可以使用无计量网络时再运行,最好设置 NetworkType.UNMETERED
约束。
此外,如果您有几个类似的任务都属于相同的约束条件,通常最好将它们组合成一个任务,这样设备只需唤醒一次即可。例如,假设您的应用有三个不同的数据集需要与云存储同步。与其安排三个不同的任务(每个数据集一个)——通常更好的方法是只安排一个“同步数据”任务,定义适当的约束,并让该任务在运行时执行所有挂起的 数据同步。
也就是说,您不应尝试将不相关的任务组合成一个多合一的任务。相反,只需确保为每个任务提供适当的约束即可。例如,如果任务的优先级较低,请确保指定它们应该在设备空闲并充电时运行。这样,即使设备被唤醒多次,也不会影响用户体验或电池寿命。
只有在任务对时间敏感时才将其标记为紧急任务
如果任务特别紧急,您可以将其标记为紧急任务。(对于 JobScheduler 作业,请调用 JobInfo.Builder.setExpedited(true)
。)这样做会以多种方式优先处理该任务。例如,系统会在能够时立即运行这些任务,并且电源管理限制不太可能影响紧急任务。
由于这些原因,您应该注意仅在需要时才将任务标记为紧急任务。因为紧急任务可能会覆盖某些系统效率,所以紧急任务可能会比未被这样标记的任务消耗更多电量。
只有在任务对时间敏感,并且如果任务执行时间过长会影响用户体验的情况下,才应将任务标记为加急处理。例如,如果您的应用运行一项任务来处理高优先级的 FCM 消息,那么将该任务标记为加急处理是合适的理由。但是,您不应该仅仅为了覆盖系统优化而将任务标记为加急处理。
检查任务停止的原因
如果您的任务在完成之前停止,您可以通过调用 WorkInfo.getStopReason()
来检查它们停止的原因。(对于 JobScheduler 作业,请调用 JobParameters.getStopReason()
)这样做很重要,原因有几个。首先,当然,您希望您的任务完成。找出任务停止的原因可以帮助您避免类似的情况。但同样重要的是,系统很可能因为过度使用系统资源的行为而停止任务。您不希望您的应用成为一个“不良公民”,不必要地消耗电池或网络资源。
例如,如果您的任务经常因 STOP_REASON_TIMEOUT
原因停止,则可能存在某些边缘情况会导致您的任务花费的时间比您预期的长得多。
我们建议您使用分析引擎来跟踪应用的任务是否停止,以及停止的原因。