Ya está disponible la segunda Vista previa para desarrolladores de Android 11; pruébala y comparte tus comentarios.

Guía para el procesamiento en segundo plano

Cada app para Android tiene un subproceso principal que se encarga de manejar la IU (lo que incluye medir y dibujar vistas), coordinar las interacciones del usuario y recibir eventos del ciclo de vida. Si hay demasiadas tareas en este subproceso, la app parece bloquearse o ralentizarse, lo que genera una experiencia del usuario no deseada. Las operaciones y los cálculos de gran duración, como decodificar un mapa de bits, acceder al disco o enviar solicitudes de red, deben realizarse en subprocesos independientes en segundo plano. En general, todo lo que lleve más de unos pocos milisegundos debería delegarse a un subproceso en segundo plano. Es posible que se deban realizar algunas de estas tareas mientras el usuario interactúa de forma activa con la app. Para saber cómo puedes ejecutar tareas en subprocesos en segundo plano y fuera del subproceso de IU principal mientras la app está en uso, consulta la guía de soluciones de subprocesamiento.

Las aplicaciones también pueden requerir que se ejecuten algunas tareas incluso cuando el usuario no usa la app de forma activa, por ejemplo, para hacer una sincronización periódica con un servidor en segundo plano o una búsqueda frecuente de contenido nuevo dentro de una app. También pueden requerir que los servicios se ejecuten inmediatamente hasta completarse incluso después de que el usuario haya terminado de interactuar con la app. La guía te ayudará a conocer qué solución se adapta mejor a tus necesidades para estos casos prácticos.

Desafíos del procesamiento en segundo plano

Las tareas en segundo plano consumen los recursos limitados de un dispositivo, como la RAM y la batería. Esto puede causar una experiencia del usuario deficiente si no se maneja de forma adecuada.

Para maximizar la batería y ofrecer un buen comportamiento de la app, Android restringe la actividad en segundo plano cuando la app (o una notificación de servicio en primer plano) no está visible para el usuario.

  • Android 6.0 (API nivel 23) introdujo el modo Descanso y App Standby. El modo Descanso restringe el comportamiento de la app cuando la pantalla está apagada y el dispositivo no se mueve. App Standby coloca las aplicaciones no utilizadas en un estado especial que restringe el acceso a la red, los trabajos y las sincronizaciones.
  • Android 7.0 (API nivel 24) limitó las transmisiones implícitas e introdujo Descansa, estés donde estés.
  • Android 8.0 (API nivel 26) limitó aún más el comportamiento en segundo plano, que incluyó la obtención de la ubicación en segundo plano y la liberación de bloqueos de activación almacenados en caché.
  • Android 9 (API nivel 28) introdujo Intervalos de App Standby, en los que las solicitudes de recursos de la app se priorizan de forma dinámica según los patrones de uso de la aplicación.

Es importante comprender las necesidades de tu tarea y elegir la solución correcta que cumpla con las prácticas recomendadas del sistema para programar tu trabajo en segundo plano.

Cómo elegir la solución adecuada para tu trabajo

  • ¿El trabajo se puede posponer o debe realizarse de inmediato? Por ejemplo, si necesitas obtener datos de la red en respuesta al clic del usuario en un botón, ese trabajo debe realizarse de inmediato. Sin embargo, si deseas subir tus registros al servidor, ese trabajo puede posponerse sin perjudicar el rendimiento de la app ni las expectativas de los usuarios.

  • ¿El trabajo depende de las condiciones del sistema? Tal vez quieras que tu trabajo se ejecute solamente cuando el dispositivo cumpla con ciertas condiciones, como estar conectado a la alimentación o a Internet, etc. Por ejemplo, es posible que tu app necesite comprimir de forma periódica sus datos almacenados. Para evitar que el usuario se vea afectado, es recomendable que este trabajo se realice únicamente cuando el dispositivo se esté cargando y esté inactivo.

  • ¿El trabajo debe ejecutarse en un momento preciso? Una app de calendario puede permitir que el usuario configure un recordatorio para un evento en una fecha y una hora específicas. El usuario espera ver la notificación del recordatorio en el momento correcto. En otros casos, es posible que la app no tenga en cuenta el momento preciso en el que se ejecuta el trabajo. La app podría tener requisitos generales (como "primero debe ejecutarse el trabajo A; segundo, el trabajo B; y tercero, el trabajo C"), pero no requerir que los trabajos se ejecuten en un momento específico.

Figura 1: ¿Cuál es la mejor manera de llevar a cabo trabajos en segundo plano?

WorkManager

Para los trabajos que se pueden posponer y se espera que se ejecuten incluso si tu dispositivo o tu aplicación se reinician, usa WorkManager. WorkManager es una biblioteca de Android que ejecuta de manera fluida el trabajo en segundo plano que se puede posponer cuando se cumplen las condiciones del trabajo (como la disponibilidad de la red y la alimentación).

WorkManager ofrece una API retrocompatible (API nivel 14 y versiones posteriores) que aprovecha la API de JobScheduler (API nivel 23 y versiones posteriores) y posteriores para ayudar a optimizar la duración de la batería y los trabajos por lotes, además de una combinación de AlarmManager y BroadcastReceiver en dispositivos con versiones anteriores.

Servicios en primer plano

Para los trabajos que inicia el usuario y deben ejecutarse de inmediato sin detenerse hasta su finalización, utiliza un servicio en primer plano. Al usar estos servicios, se le indica al sistema que la app está haciendo algo importante y, por lo tanto, no se debe cerrar. Los servicios en primer plano son visibles para los usuarios mediante una notificación que no se puede descartar en la bandeja de notificaciones.

AlarmManager

Si necesitas ejecutar un trabajo en un momento preciso, usa AlarmManager. AlarmManager inicia la app, si es necesario, para realizar el trabajo en el momento que especifiques. Sin embargo, si no es necesario que el trabajo se ejecute en un momento preciso, WorkManager es una mejor opción (WorkManager puede equilibrar mejor los recursos del sistema). Por ejemplo, si necesitas ejecutar un trabajo cada hora aproximadamente, pero no requieres que se ejecute en un momento específico, debes usar WorkManager para configurar un trabajo recurrente.

DownloadManager

Si tu app realiza descargas HTTP prolongadas, te conviene usar DownloadManager. Es posible que los clientes soliciten que se descargue un URI en un archivo de destino particular que puede estar fuera del proceso de la app. El Administrador de descargas realizará la descarga en segundo plano teniendo en cuenta las interacciones HTTP y reintentando las descargas después de fallas o durante cambios de conexión y reinicios del sistema.