有没有办法知道 WorkManager Job 是否因为约束而没有执行?

Is there a way to know if a WorkManager Job did not execute because of a constraint?

现在我在 WorkManager 上有一些使用此约束的作业。

wifiConstraint = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.UNMETERED)
                .build()

work_version = "2.2.0"
implementation "androidx.work:work-runtime-ktx:$project.work_version"

客户的设备似乎已连接到 WiFi 网络,但作业在 6 小时后仍未发送(已设置为 repeatInterval: 30, TimeUnit.MINUTES)。

此 WiFi 网络是具有配置文件的企业网络。

有没有办法知道 Job 是否不满足既定约束条件,以及不满足哪个约束条件?

谢谢。

2020 年 4 月 9 日更新

WorkManager v2.4.0 alpha 01 引入了使用

从 WorkManager 请求诊断信息的能力
adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>". 

这提供了很多有用的信息,包括:

  • 过去 24 小时内完成的工作请求数。
  • 当前 运行 的工作请求。
  • 计划的工作请求。 (aosp/1235501)

这仅适用于调试版本。

遵循原始答案,对旧的 WorkManager 版本和发布版本仍然有效。

您无法直接在 WorkManager 中获取此信息,但是,假设此设备 运行ning 在 Android 6.0+(API level23+)上,您可以获取有关的一些信息WorkManager 使用的底层 JobScheduler API。

使用命令:

adb shell dumpsys jobscheduler

您应该能够使用此命令识别您的任务。

这将为您提供以下类别的大量输出。

  • 设置
  • 注册了 XX 个职位
  • 连通性
  • 警报
  • 空闲
  • 电池
  • AppIdle
  • 内容
  • 工作经历
  • 待定队列

如果您在 Android 7.1 及更高版本上进行测试,那么您可以使用以下命令强制-运行 计划作业。

adb shell cmd jobscheduler run -f PACKAGE_NAME JOB_ID