Google 致力于为黑人社区推动种族平等。查看具体举措

取消和停止工作

如果您不再需要运行先前加入队列的工作,则可以要求将其取消。最简单的方法是使用其 id 并调用 WorkManager.cancelWorkById(UUID) 来取消单个 WorkRequest:

Kotlin

    WorkManager.cancelWorkById(workRequest.id)
    

Java

    WorkManager.cancelWorkById(workRequest.getId());
    

在后台,WorkManager 会检查工作的 State。如果工作已经完成,则不会发生任何变化。否则,其状态将更改为 CANCELLED,之后就不会运行这个工作。任何依赖于这项工作WorkRequests 的状态也将变为 CANCELLED

此外,如果工作当前的状态为 RUNNING,则工作器也会收到对 ListenableWorker.onStopped() 的调用。如需执行任何清理操作,请替换此方法。我们会在下文详细讨论相关内容。

您也可以使用 WorkManager.cancelAllWorkByTag(String) 按标记取消 WorkRequest。请注意,此方法会取消所有具有此标记的工作。此外,您还可以使用 WorkManager.cancelUniqueWork(String) 取消具有相应唯一名称的所有工作。

停止正在运行的工作器

WorkManager 停止正在运行的工作器可能有几种不同的原因:

  • 您明确要求取消它(例如,通过调用 WorkManager.cancelWorkById(UUID) 取消)。
  • 如果是唯一工作,您使用 ExistingWorkPolicy REPLACE 明确地将新的 WorkRequest 加入到了队列中。旧的 WorkRequest 会立即被视为已终止。
  • 您的工作约束已不再得到满足。
  • 系统出于某种原因指示您的应用停止工作。如果超过 10 分钟的执行期限,可能会发生这种情况。系统会安排在稍后重试该工作。

在这些情况下,您的工作器会收到对 ListenableWorker.onStopped() 的调用。如果操作系统决定关闭您的应用,您应执行清理工作并合作地终止工作器。例如,您应该在此时或尽早关闭所打开的数据库和文件句柄。此外,如果您想要确认系统是否已经停止您的应用,可以调用 ListenableWorker.isStopped()。即使您通过在调用 onStopped() 后返回 Result 来指示工作已完成,WorkManager 都会忽略该 Result,因为工作器已经被视为停止。

您可以查看在 WorkManager 中进行线程处理部分,了解如何处理 onStopped() 的示例。