取消和停止工作

如果您不再需要运行先前加入队列的作业,则可以申请取消。最简单的方法是使用其 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() 的示例。