Cómo programar tareas con WorkManager   Parte de Android Jetpack

WorkManager es la solución recomendada para el trabajo persistente. El trabajo es persistente cuando permanece programado a través de reinicios de la app y del sistema. Debido a que la mayor parte del procesamiento en segundo plano se logra mejor con un trabajo persistente, WorkManager es la API principal recomendada para el procesamiento en segundo plano.

Tipos de trabajo persistente

WorkManager controla tres tipos de trabajos persistentes:

  • Inmediatas: Tareas que deben comenzar de inmediato y completarse pronto. Se puede acelerar.
  • Larga duración: Tareas que podrían ejecutarse durante más tiempo, posiblemente en más de 10 minutos.
  • Diferible: Tareas programadas que comienzan más tarde y pueden ejecutarse de forma periódica.

En la Figura 1, se describe cómo se relacionan los diferentes tipos de trabajos persistentes entre sí.

El trabajo persistente puede ser inmediato, de larga duración o diferible
Figura 1: Tipos de trabajo persistente

De manera similar, en la siguiente tabla se describen los distintos tipos de trabajo.

Tipo Periodicidad Cómo acceder
Inmediatez Una vez OneTimeWorkRequest y Worker.

Para el trabajo acelerado, llama a setExpedited() en tu OneTimeWorkRequest.

Larga duración Una vez o periódicamente Cualquier WorkRequest o Worker. Llama a setForeground() en el trabajador para controlar la notificación.
Diferibles Una vez o periódicamente PeriodicWorkRequest y Worker.

Si deseas obtener más información para configurar WorkManager, consulta la guía sobre cómo definir tus WorkRequests.

Funciones

Además de brindar una API más simple y coherente, WorkManager tiene otros beneficios clave, como:

Restricciones de trabajos

Mediante las restricciones de trabajo, define de manera declarativa las condiciones óptimas que necesita tu trabajo para ejecutarse. Por ejemplo, solo se debe ejecutar cuando el dispositivo se encuentra en una red no medida, cuando el dispositivo está inactivo o cuando tiene suficiente batería.

Programación sólida

WorkManager te permite programar un trabajo para que se ejecute una sola vez o periódicamente con ventanas de programación flexibles. También puedes etiquetar los trabajos y asignarles un nombre, lo que te permitirá programar trabajos únicos y reemplazables, así como supervisar o cancelar grupos de trabajo en forma conjunta.

El trabajo programado se almacena en una base de datos SQLite administrada de forma interna, y WorkManager se encarga de garantizar que ese trabajo se conserve y se reprograme después de todos los reinicios del dispositivo.

Además, WorkManager cumple con las funciones de ahorro de energía y las prácticas recomendadas, como el modo Descanso, para que no tengas que preocuparte por eso.

Trabajo acelerado

Puedes usar WorkManager para programar trabajos inmediatos que se ejecutarán en segundo plano. Debes usar Trabajo acelerado para tareas que son importantes para el usuario y que se completan en pocos minutos.

Política de reintento flexible

A veces, se producen errores en el trabajo. WorkManager ofrece políticas de reintento flexibles que incluyen una política de retirada exponencial configurable.

Encadenamiento de trabajos

Si tienes trabajos complejos que están relacionados, encadena las tareas de trabajo individuales mediante una interfaz intuitiva que te permite controlar qué partes se ejecutan de forma secuencial y cuáles en paralelo.

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

Para cada tarea de trabajo, puedes definir datos de entrada y salida. Si encadenas los trabajos, WorkManager pasa automáticamente los resultados de una tarea de trabajo a la siguiente.

Interoperabilidad de subprocesos integrada

WorkManager se integra sin problemas con Corrutinas y RxJava, y brinda la flexibilidad de conectar tus propias APIs asíncronas.

Usa WorkManager para trabajos confiables

WorkManager está diseñado para trabajos que se requieren para ejecutarse de manera confiable incluso si el usuario sale de la pantalla, la app se cierra o el dispositivo se reinicia. Por ejemplo:

  • Envío de registros o análisis a servicios de backend.
  • Sincronización periódica de los datos de la app con un servidor.

WorkManager no está diseñado para el trabajo en segundo plano durante el proceso, que puede finalizar de manera segura si el proceso de la app desaparece. Tampoco es una solución general para todo el trabajo que requiera una ejecución inmediata. Revisa la guía de procesamiento en segundo plano para ver qué solución satisface tus necesidades.

Relación con otras APIs

Si bien las corrutinas son la solución recomendada para ciertos casos de uso, no deberías usarlas para trabajos persistentes. Es importante tener en cuenta que las corrutinas son un framework de simultaneidad, mientras que WorkManager es una biblioteca para trabajos persistentes. Asimismo, debes usar AlarmManager solo para relojes o calendarios.

API Recomendado para Relación con WorkManager
Corrutinas Todo el trabajo asíncrono que no necesita ser persistente. Las corrutinas son el medio estándar para dejar el subproceso principal en Kotlin. Sin embargo, dejan memoria cuando la app se cierra. Para trabajos persistentes, usa WorkManager.
AlarmManager Solo alarmas. A diferencia de WorkManager, AlarmManager activa un dispositivo en modo Descanso. Por lo tanto, no es eficiente en términos de energía y administración de recursos. Úsalo solo para alarmas o notificaciones precisas, como eventos de calendario, no para el trabajo en segundo plano.

Reemplaza las APIs obsoletas

La API de WorkManager es el reemplazo recomendado de todas las APIs anteriores de programación en segundo plano de Android, incluidas FirebaseJobDispatcher, GcmNetworkManager y JobScheduler.

Introducción

Consulta la Guía de introducción para comenzar a usar WorkManager en tu app.

Recursos adicionales

Para obtener más información sobre WorkManager, consulta los siguientes recursos.

Ejemplos

Videos

Blogs

  • Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
  • Inicio de apps