Cómo hacer que el Administrador de trabajo de Google trabaje para usted

Fuente de la imagen: https://ayusch.com

Considere algunos casos de uso que encontramos en nuestras tareas diarias de desarrollo de Android:

  1. Descargar archivos de datos de un servidor remoto para un juego móvil.
  2. Descargar archivos de un servidor.
  3. Sincronización de datos recopilados en dispositivos móviles con un servicio de fondo, por ejemplo: carga de análisis de fallos, archivos de registro, etc.
  4. Copia de seguridad de los archivos del dispositivo en el almacenamiento en línea.

¿Qué es común entre estos casos de uso?

  • Todos son tareas de larga duración.
  • Pueden diferirse para ejecutarse en un hilo de fondo, mientras el usuario interactúa con la aplicación. Estas tareas no deberían afectar el rendimiento de la aplicación.
  • También se pueden ejecutar incluso cuando el usuario no está interactuando con la aplicación.

Realizar tales tareas asincrónicas es muy común en las aplicaciones modernas de Android. Rara vez nos encontramos con aplicaciones que no interactúan con ningún servicio de fondo y se ejecutan completamente fuera de línea. Por lo tanto, teniendo esto en cuenta, los ingenieros de Google desarrollaron muchas API de programación de trabajos para programar tales tareas en Android, como Servicios, Administrador de alarmas, Programador de trabajos, Administrador de red de GCM, Firebase Job Dispatcher, antes de presentar su último (y en mi opinión la mejor) solución: Work Manager.

Work Manager, en mi opinión, es, con mucho, la mejor API que Google ha creado para Android en los últimos años. Pero primero, analicemos todos los mecanismos de programación además del gerente de trabajo y echemos un vistazo a sus pros y sus contras. Al final, explicaré por qué Work Manager supera a la mayoría de las soluciones existentes. Además, te diré cuándo no utilizar el Administrador de trabajo.

En este artículo, discutiremos estos 4 mecanismos de programación en orden:

  1. Servicios
  2. Programador de trabajos
  3. GCM Network Manager
  4. Firebase Job Dispatcher

Entonces, ¡comencemos!

Servicios

Primero están los servicios. Los servicios han existido desde que tengo memoria. Han sido la solución ideal para los desarrolladores para realizar tareas de larga duración, como reproducir música, descargar archivos, sincronizar los datos, procesar los activos de la aplicación de Android y muchos más. Y aunque ahora sabemos que hay formas mucho mejores y más eficientes de hacer estas tareas, los servicios siguen siendo muy relevantes para algunos casos de uso, como reproducir música en segundo plano con una notificación en la bandeja de notificaciones.

Pero para el resto de los casos de uso, hemos recorrido un largo camino, y Android ha proporcionado API mucho mejores que los servicios para tales tareas. Entonces, veamos algunos de los problemas con los servicios:

  • De manera predeterminada, los servicios se ejecutan en el subproceso principal de la aplicación en la que se declaran. Por lo tanto, cualquier tarea de larga duración, como el procesamiento de imágenes, la creación de redes o la reproducción de MP-3, ralentiza el rendimiento de la aplicación y comenzamos a notar fluctuaciones en la interfaz de usuario.
  • Debe usar la comunicación entre procesos para hablar con él, que es más lenta que si estuviera en el mismo proceso que el cliente.
  • La depuración es difícil, ya que debe adjuntarla a un proceso diferente.
  • Si su servicio falla, se bloquea independientemente del proceso principal. Esto también puede ser una ventaja a veces.
  • Para las tareas de larga duración, deberá usar hilos dentro de los servicios, lo que hace que la implementación sea cada vez más compleja.
  • Si olvida detener el servicio si se completa una tarea, puede seguir ejecutándose en segundo plano y agotar la batería.

Por lo tanto, si bien los servicios pueden ser buenos para tareas como reproducir música con notificaciones, no es la solución más adecuada para tareas de larga duración que pueden bloquear el hilo principal como las redes, la computación pesada, la reproducción de MP3, etc.

Programadores de trabajo

La API del planificador de trabajos se introdujo en el nivel 21 de API. Es eficiente para las tareas de red y se ejecutará en segundo plano si se cumplen los criterios especificados en JobInfo.Builder (), como cuando el dispositivo se está cargando, inactivo, conectado a Internet, etc. También intentará agrupar estos trabajos para ahorrar recursos del sistema. También viene con lógica de retroceso y reintento si un trabajo falla por alguna razón.

Pero no es adecuado para trabajos no diferibles, como la descarga de un activo al hacer clic en el botón, lo que debería suceder de inmediato y no demorarse.

La otra desventaja, y la que molesta a la mayoría de los desarrolladores, es que solo es compatible con las versiones API 21 y superiores. Por lo tanto, no funcionaría en dispositivos Android que se ejecuten en versiones menores de 21, que es el 15% en este momento.

GCM Network Manager

GCM Network Manager viene con toda la bondad de Job Scheduler con el beneficio adicional de la compatibilidad con versiones anteriores. Internamente, GCM Network Manager usa Job Scheduler para la versión API> 21. Para las versiones <21, usa el motor de programación de Google Play Services.

También tiene la capacidad de programar tareas puntuales, así como tareas periódicas. Por lo tanto, elimina la tarea adicional de reprogramar el Trabajo del desarrollador, requerida en Job Scheduler.

Pero tiene algunos deméritos:

  • Como utiliza el motor de programación de Play Services, solo funcionará en dispositivos con servicios de Play instalados.
  • Cuando se actualizan los servicios de reproducción, los trabajos se eliminan. El desarrollador tiene que encargarse de programar nuevamente el trabajo.
  • No es adecuado para tareas no diferibles o tareas que se supone que se ejecutan en un momento específico.
  • Google desactivó GCM el 10 de abril de 2018 y se eliminará por completo antes del 11 de abril de 2019, por lo tanto, es aconsejable no usar GCM Network Manager más.

Echemos un vistazo a Firebase Job Dispatcher que resuelve nuestros problemas.

Firebase Job Dispatcher

Firebase Job Dispatcher es una biblioteca de Android para programar trabajos en segundo plano. Admite compatibilidad con versiones anteriores hasta la versión 9 de API.

Al igual que GCM Network Manager, utiliza el motor de programación de Google Play Services para programar trabajos. Si el dispositivo no tiene servicios de reproducción instalados, usa el Administrador de alarmas. Para dispositivos Android con API versión 21 o superior, utiliza Job Scheduler.

Hasta aquí todo bien. Gestiona la compatibilidad con versiones anteriores, se ejecuta en dispositivos sin servicios de Google Play y tiene tareas únicas y periódicas.

Entonces, ¿por qué molestarse con Work Manager cuando Firebase Job Dispatcher lo tiene todo?

Bueno, porque, cuando estas API se usan incorrectamente, conduce al agotamiento de la batería. Por lo tanto, para ahorrar energía, Android ha lanzado muchas funciones de ahorro de energía, como Doze Mode, Doze on-the-go, límites en los servicios en segundo plano, App Standby Buckets, etc. Entonces, como desarrollador, se convierte en nuestra responsabilidad aprovechar todo esto para garantizar que nuestra aplicación siga siendo eficiente con la batería en todos los niveles de API.

Esto significa una gran cantidad de spaghetti if-else code. Entonces, permítanme presentarles a todos la última incorporación a la API de programación en el desarrollo de Android:

Gerente de trabajo

Como ya he mencionado, el administrador de trabajo es, según yo, una de las mejores API que Google ha lanzado para Android en los últimos años. Marca todas las casillas que espera de una API de programación y tiene un alto nivel de abstracción para que no tenga que preocuparse por los detalles granulares como el consumo de energía, la reducción de la gestión y la reprogramación.

Work Manager es adecuado para trabajos de fondo diferibles y garantizados. Las palabras clave para centrarse aquí son diferibles y garantizadas.

Work Manager en Android no ejecutará sus tareas de inmediato, pero las diferirá para que se ejecuten en un momento en el que se cumplan las restricciones que menciona. También tiene en cuenta las limitaciones de la batería. También garantiza que el trabajo se ejecutará incluso si su dispositivo se reinicia.

Aquí hay un gran diagrama que describe cuándo es perfecto usar Work Manager en sus aplicaciones de Android:

Fuente de la imagen: Google

Como puede ver, es adecuado para tareas diferibles que no necesitan ejecutarse en un momento preciso en el futuro como una alarma o recordatorio.

Beneficios de usar Work Manager:

  • Compatible con versiones anteriores hasta API 14
  • Agregue restricciones como redes, carga.
  • Puede programar tareas puntuales o periódicas.
  • Puede encadenar tareas juntas.
  • Garantiza la ejecución incluso si el dispositivo se reinicia.
  • Ejecuta tareas en un momento optimizado en el futuro considerando la batería y la disponibilidad de la red.
  • Forma parte de las bibliotecas de Android Jetpack y lo recomienda Google: P

Es adecuado para tareas como enviar informes de fallas a un servicio en segundo plano, sincronizar datos con un servicio web, procesar los activos de su aplicación, etc.

Conclusión

Work Manager, en mi opinión, definitivamente se puede utilizar para realizar todas las tareas diferibles en su aplicación de Android.

Pero si la tarea debe realizarse de inmediato (reproducir música, descargar un archivo), será mejor que la realice con un servicio en primer plano (por ejemplo: reproducir música y mostrar una notificación para cambiar canciones) o Download Manager (para descargar un archivo).

Entonces, ahora puede seguir adelante y auditar su código para posibles reemplazos con Work Manager. Un buen lugar para comenzar sería todos los servicios que crea su aplicación;)

El artículo fue publicado originalmente aquí.

Que sigue

En la próxima publicación sobre Work Manager, integraremos Work Manager en una aplicación de Android y veremos cómo configurar y usar Work Manager en Android. ¡Así que estad atentos!

* Importante *: he creado un espacio de trabajo SLACK para desarrolladores móviles donde podemos compartir nuestros conocimientos sobre todo lo último en tecnología, especialmente en el desarrollo de Android, RxJava, Kotlin, Flutter y el desarrollo móvil en general.
Haga clic en este enlace para unirse al espacio de trabajo flojo. ¡Es totalmente gratis!

¿Te gusta lo que lees? No olvides compartir esta publicación en Facebook, Whatsapp y LinkedIn.

Puedes seguirme en LinkedIn, Quora, Twitter e Instagram, donde respondo preguntas relacionadas con el desarrollo móvil, especialmente Android y Flutter.