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