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í.
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
- Serie de videos Workmanager: MAD Skills
- Cómo trabajar con WorkManager de Android Dev Summit 2018
- WorkManager: Conceptos más avanzados, de Android Dev Summit 2019