Cómo cancelar y detener el trabajo

Si ya no necesitas ejecutar tu trabajo que se encontraba previamente en la cola, puedes solicitar que se cancele. La forma más sencilla de hacerlo es cancelar una sola WorkRequest con su id y llamar a WorkManager.cancelWorkById(UUID):

Kotlin

    WorkManager.cancelWorkById(workRequest.id)
    

Java

    WorkManager.cancelWorkById(workRequest.getId());
    

En niveles más profundos, WorkManager verificará el State del trabajo. Si el trabajo ya está finalizado, no pasará nada. De lo contrario, su estado cambiará a CANCELLED y el trabajo no se ejecutará en el futuro. También se cancelan las WorkRequests que dependen de este trabajoCANCELLED.

Además, si el trabajo está actualmente en estado RUNNING, el trabajador también recibirá una llamada para ListenableWorker.onStopped(). Anula este método para controlar cualquier posible limpieza. Más adelante, analizaremos este tema en profundidad.

También puedes cancelar WorkRequests por etiqueta mediante WorkManager.cancelAllWorkByTag(String). Ten en cuenta que este método cancela todo el trabajo con esta etiqueta. Además, puedes cancelar todo el trabajo con un nombre único mediante WorkManager.cancelUniqueWork(String).

Cómo detener a un trabajador en ejecución

Hay algunas razones diferentes por las que WorkManager puede detener a tu trabajador en ejecución:

  • Solicitaste explícitamente que se cancele (llamando a WorkManager.cancelWorkById(UUID), por ejemplo).
  • En el caso de un trabajo único, solicitaste explícitamente una nueva WorkRequest con un ExistingWorkPolicy de REPLACE. La WorkRequest anterior se considera terminada inmediatamente.
  • Las restricciones de tu trabajo ya no se cumplen.
  • El sistema le indicó a tu app que detuviera tu trabajo por algún motivo. Esto puede suceder si supera el plazo de ejecución de 10 minutos. El trabajo está programado para volver a intentarlo más adelante.

En estas condiciones, tu trabajador recibirá una llamada a ListenableWorker.onStopped(). Debes realizar la limpieza y finalizar cooperativamente a tu trabajador en caso de que el sistema operativo decida cerrar tu app. Por ejemplo, debes cerrar los controladores abiertos de las bases de datos y los archivos en este momento o lo antes posible. Además, puedes consultar ListenableWorker.isStopped() cada vez que desees comprobar si ya se detuvo. Incluso si señalas la finalización de tu trabajo mediante un Result después de que se llama a onStopped(), WorkManager ignorará ese Result porque el trabajador ya se considera detenido.

Puedes ver ejemplos de cómo controlar onStopped() en la sección Subprocesos de WorkManager.