【问题标题】:Periodic work requests skipped with WorkManager in Andorid在 Android 中使用 WorkManager 跳过定期工作请求
【发布时间】:2020-09-17 19:05:15
【问题描述】:

我使用WorkManager 实现了一些重复性任务,当我积极使用手机时,它工作得很好(每个时间段运行我的代码早晚几分钟)。在夜间它会跳过很多时间段,我想知道为什么会发生这种情况以及如何解决这个问题。

fun startService() {
    val constraintsBuilder = Constraints.Builder()
    constraintsBuilder.setRequiredNetworkType(NetworkType.CONNECTED)
    val constraints = constraintsBuilder.build()

    val work = PeriodicWorkRequest.Builder(
        HttpWorker::class.java,
        40, TimeUnit.MINUTES,
        15, TimeUnit.MINUTES
    ).setConstraints(constraints)
        .addTag("TAG_WORKER")
        .build()

    WorkManager.getInstance().enqueueUniquePeriodicWork(
        HttpWorker::class.java.simpleName,
        ExistingPeriodicWorkPolicy.REPLACE,
        work
    )
}

结果如下:

--->运行 09:14

--->运行 09:54(40 分钟)

--->运行 10:33(39 分钟)

--->运行 11:53(80 分钟)

--->运行 12:33(39 分钟)

...

--->00:35 运行

--->运行 01:20(45 分钟)

--->运行 03:39(139 分钟)!!!

--->运行 07:14(215 分钟)!!!

--->运行 07:47(30 分钟)

--->运行 08:26(39 分钟)

...

这肯定与设备活动有关,还请注意,我为我的应用禁用了省电功能(我的设备是三星 Galaxy 2018 Android 9.0 的新型号)。我应该怎么做才能在夜间(根本不使用设备时)忽略那些跳过的时间段。

附言。我的应用不在 Google Play 上,所以任何黑客都没有问题(但没有 root)

【问题讨论】:

  • 我认为应该是设备制造商的问题,当设备进入打盹模式时,它会禁用除 RIL/网络服务之外的所有服务。尝试与不同的设备制造商并检查问题是否仍然存在。
  • 仔细阅读本文了解打盹模式、待机模式
  • @Quicklearner - 是的,有打盹模式,但我为我的应用禁用了省电功能。也许我需要做一些额外的事情来强制我的应用即使在打瞌睡模式下也能做定期工作(我的应用不在 Google Play 上,所以黑客没问题)

标签: android android-workmanager


【解决方案1】:

根据文档

setRequiresDeviceIdle

public Constraints.Builder setRequiresDeviceIdle (boolean 需要设备空闲) 设置设备是否应该空闲以便 WorkRequest 运行。 默认值为 false。

true : 如果设备必须空闲才能运行工作

因此,如果您添加此约束。你的工作将在晚上进行!

constraintsBuilder.setRequiresDeviceIdle(true)

【讨论】:

  • 我认为这与他们的文档有点不同:当设置为 true 时,确保如果设备处于活动状态,则此作业不会运行。 所以如果我使用电话一整天我的工作都不会开始。
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多