Ilustración de Virginia Poltrack




Hay muchas consideraciones y recomendaciones para manejar el trabajo en segundo plano, tal como se indica en esta serie de entradas de blog de Google. Una de las llamadas recurrentes es una biblioteca de Android Jetpack denominada WorkManager, que amplía las capacidades de la API del marco de trabajo de JobScheduler y es compatible con Android 4.0 y versiones posteriores (API 14+). Hoy se lanzó la versión Beta de WorkManager.
Esta entrada de blog es la primera de una nueva serie enfocada en ese recurso. Exploraremos los conceptos básicos de WorkManager, cómo y cuándo usarlo, y lo que sucede detrás de escena. Luego, nos sumergiremos en casos de uso más complejos.

¿Qué es WorkManager?

WorkManager es un componente de arquitectura de Android que forma parte de Android Jetpack, una nueva forma de crear aplicaciones modernas para Android.
WorkManager es una biblioteca de Android que ejecuta en segundo plano procesos diferibles cuando se cumplen restricciones del trabajo.
WorkManager está destinado a tareas que requieren una garantía de que el sistema las ejecutará incluso si se cierra la app.
En otras palabras, WorkManager proporciona una API amigable con la batería que encapsula años de evolución de las restricciones de comportamiento de Android en segundo plano. Este es un aspecto crítico para las aplicaciones de Android que necesitan ejecutar tareas en segundo plano.

Cuándo usar WorkManager

WorkManager maneja los procesos en segundo plano que deben ejecutarse cuando se cumplen varias restricciones, independientemente de si el proceso de la aplicación está activo o no. El trabajo en segundo plano puede iniciarse cuando la aplicación está en segundo plano, cuando está en primer plano o cuando se inicia en primer plano, pero pasa a segundo. Independientemente de lo que esté haciendo la aplicación, el proceso en segundo plano debe continuar ejecutándose, o reiniciarse si Android finaliza su proceso.
Una confusión común acerca de WorkManager es que es para tareas que deben ejecutarse en un subproceso de "segundo plano", pero no necesitan sobrevivir a la finalización del proceso. Este no es el caso. Existen otras soluciones para este caso de uso, como las coroutinas de Kotlin, ThreadPools o bibliotecas como RxJava. Puedes encontrar más información sobre este caso de uso en la guía de procesamiento en segundo plano.
Hay muchas situaciones diferentes en las que necesitas ejecutar un proceso en segundo plano y, por lo tanto, diferentes soluciones para hacerlo. Esta entrada de blog sobre procesos en segundo plano proporciona mucha información sobre cuándo usar WorkManager. Echa un vistazo a este diagrama del blog:

Diagrama de la ejecución moderna en segundo plano

En el caso de WorkManager, es mejor para procesos en segundo plano que deben finalizar y son diferibles.
Para empezar, pregúntate lo siguiente:
  • ¿Es necesario finalizar este proceso?
    Si el usuario cierra la aplicación, ¿se debe completar la tarea? Como ejemplo, veamos una aplicación para tomar notas que tiene una función sincronización remota. Una vez que terminas de escribir, esperas que la aplicación sincronice el contenido con un servidor de backend. Esto sucederá incluso si cambias a otra aplicación y el SO necesita cerrar la app para recuperar de memoria. También debería ocurrir incluso si reinicias el dispositivo. WorkManager garantiza que finalicen las tareas.
  • ¿Esta tarea es diferible?
    ¿Podemos ejecutar la tarea más tarde o solo es útil si se ejecuta justo ahora? Si la tarea se puede ejecutar más tarde, entonces es diferible. Volviendo al ejemplo anterior, sería bueno que tus notas se carguen inmediatamente, pero si esto no es posible y la sincronización se produce más tarde, tampoco es un problema. WorkManager respeta las restricciones en segundo plano del SO e intenta ejecutar tus procesos de manera eficiente.
Por lo tanto, como lineamiento, WorkManager está diseñado para tareas que requieren una garantía de que el sistema las ejecutará, incluso si se cierra la app. No está diseñado para procesos en segundo plano que requieran ejecución inmediata o que se ejecuten en un momento exacto. Si necesitas que tu trabajo se ejecute a una hora exacta (como un reloj de alarma o un recordatorio de evento), usa AlarmManager. Para los procesos que deben ejecutarse de inmediato, pero que son de larga duración, a menudo deberás asegurarte de que se ejecuten cuando estén en primer plano, ya sea limitando la ejecución al primer plano (en cuyo caso estos procesos ya no son tareas en segundo plano) o usando un Servicio en segundo plano.
WorkManager puede y debe sincronizarse con otras API cuando necesites desencadenar algunos procesos en segundo plano durante escenarios más complejos:
  • Si tu servidor activa el proceso, WorkManager puede sincronizarse con Firebase Cloud Messaging.
  • Si estás escuchando emisiones usando un receptor de difusión y luego necesitas activar un proceso de larga duración, puedes usar WorkManager. Ten en cuenta que WorkManager es compatible con muchas restricciones que normalmente aparecen como transmisiones: en estos casos, no es necesario que registres tus propios receptores de transmisión.

¿Por qué usar WorkManager?

WorkManager ejecuta procesos en segundo plano mientras se ocupa de problemas de compatibilidad y recomendaciones para proteger la batería y el sistema.
Además, utilizando WorkManager, puedes programar tanto tareas periódicas como complejas cadenas de tareas dependientes: el trabajo en segundo plano se puede ejecutar en paralelo o secuencialmente, donde puedes especificar un orden de ejecución. WorkManager maneja a la perfección el paso de entrada y salida entre tareas.
También puedes establecer criterios sobre cuándo debe ejecutarse la tarea en segundo plano. Por ejemplo, no hay razón para realizar una solicitud HTTP a un servidor remoto si el dispositivo no tiene una conexión de red. Por lo tanto, puede establecer una restricción para que la tarea solo se pueda ejecutar cuando haya una conexión.
Como parte de la ejecución garantizada, WorkManager se encarga de mantener tu trabajo en los reinicios del dispositivo y si el proceso se detiene por la fuerza. También puedes definir fácilmente estrategias de reintento si tu proceso se detiene y deseas volver a intentarlo más tarde.
Finalmente, WorkManager te permite observar el estado de la solicitud de trabajo para que puedas actualizar tu UI.
Para resumir, WorkManager ofrece los siguientes beneficios:
  • Es compatible con diferentes versiones de SO.
  • Sigue las recomendaciones para proteger el sistema.
  • Es compatible con tareas únicas y periódicas asíncronas.
  • Admite tareas encadenadas con entrada y salida.
  • Permite establecer restricciones sobre cuándo se ejecuta la tarea.
  • Garantiza la ejecución de tareas, incluso si se reinicia la aplicación o el dispositivo.
Veamos un ejemplo específico en el que creamos un flujo de procesamiento de tareas concurrentes que aplica filtros a una imagen. El resultado se envía a una tarea de compresión y, luego, a una de carga.
Podemos definir un conjunto de restricciones para estas tareas y especificar cuándo se pueden ejecutar:

Cadena de tareas de muestra con restricciones

Todos estos elementos definen una secuencia precisa: por ejemplo, no sabemos el orden en que se filtrarán las imágenes, pero sabemos que el worker de Compress comenzará solo después de que todos los de Filter se hayan completado.

Cómo funciona el planificador de WorkManager

Para garantizar la compatibilidad con la API de nivel 14, WorkManager elige una forma adecuada de programar una tarea en segundo plano según el nivel de API del dispositivo. WorkManager puede usar JobScheduler o una combinación de BroadcastReceiver y AlarmManager.

Cómo determina WorkManager qué planificador usar

¿WorkManager está listo para su uso en producción?

Por el momento, WorkManager está en fase Beta. Esto significa que no habrá cambios de API importantes en esta revisión.
Cuando WorkManager se publique como estable, será la forma preferida de ejecutar tareas en segundo plano. Por esta razón, este es un gran momento para comenzar a utilizar WorkManager y ayudar a mejorarlo.
Gracias a Lyla Fujiwara.

Recursos de WorkManager