Trabajo único

El trabajo único es un concepto poderoso que garantiza que solo tengas una cadena de trabajo con un nombre en particular a la vez. A diferencia de los id, los nombres únicos son legibles y especificados por el desarrollador en lugar de ser generados automáticamente por WorkManager. A diferencia de las etiquetas, los nombres únicos solo están asociados con una cadena de trabajo.

Puedes crear una secuencia de trabajo única llamando a WorkManager.enqueueUniqueWork(String, ExistingWorkPolicy, OneTimeWorkRequest) o WorkManager.enqueueUniquePeriodicWork(String, ExistingPeriodicWorkPolicy, PeriodicWorkRequest). El primer argumento es el nombre único: esta es la clave que usamos para identificar las WorkRequest. El segundo argumento es la política de resolución de conflictos, que especifica qué debe hacer WorkManager si ya existe una cadena de trabajo sin terminar con ese nombre único:

  • Cancela la cadena existente y utiliza REPLACE para reemplazar la nueva.
  • Usa KEEP para conservar la secuencia existente e ignorar tu nueva solicitud.
  • Usa APPEND para adjuntar tu nueva secuencia a la existente. De esa manera, se ejecutará la primera tarea de la nueva secuencia después de que finalice la última tarea de la secuencia existente. No puedes usar APPEND con PeriodicWorkRequest.

El trabajo único puede ser útil si tienes una tarea que no se debe poner en cola varias veces. Por ejemplo, si tu app necesita sincronizar sus datos con la red, puedes poner en cola una secuencia llamada "sincronización" y especificar que tu nueva tarea debería ignorarse si ya hay una secuencia con ese nombre. Las secuencias de trabajo único también pueden ser útiles si necesitas crear gradualmente una cadena larga de tareas. Por ejemplo, una app de edición de fotos puede permitir que los usuarios deshagan una cadena larga de acciones. Cada una de esas operaciones de deshacer puede llevar un tiempo, pero deben realizarse en el orden correcto. En este caso, la app podría crear una cadena de "deshacer" y agregar cada operación de deshacer a la cadena según sea necesario.

Finalmente, si necesitas crear una cadena de trabajo único, puedes usar WorkManager.beginUniqueWork(String, ExistingWorkPolicy, OneTimeWorkRequest) en lugar de beginWith().