Programación de tareas

Cuando quieras ejecutar tareas que seguirán ejecutándose incluso si la app deja el estado visible, te recomendamos que uses la biblioteca WorkManager de Jetpack. WorkManager incluye un mecanismo de programación sólido que permite que las tareas persistan después de los reinicios de la app y del dispositivo.

Tipos de trabajo

WorkManager controla tres tipos de trabajos:

  • 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 tareas entre sí.

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

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.
Diferible 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 de WorkManager

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

En esta tabla, se muestra cómo se relaciona WorkManager con APIs similares. Esta información puede ayudarte a elegir la API adecuada para los requisitos de tu app.

API Recomendado para Relación con WorkManager
Corrutinas Todo el trabajo asíncrono que no necesita persistir si la app deja el estado visible. Las corrutinas son el medio estándar para dejar el subproceso principal en Kotlin. Sin embargo, se detienen en cuanto se cierra la app. Para el trabajo que debe persistir incluso después de que se cierre la app, usa WorkManager.
AlarmManager Solo alarmas. A diferencia de los trabajadores regulares de WorkManager, las alarmas exactas de AlarmManager activan 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 recurrente.

Reemplaza las APIs obsoletas

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

Comenzar

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

Recursos adicionales

En las siguientes secciones, se proporcionan algunos recursos adicionales.

Videos

Blogs

Ejemplos