Cuando una app se ejecuta en segundo plano, consume parte de los recursos limitados del dispositivo, como la RAM. Esto puede provocar un deterioro de la experiencia de usuario, especialmente si el usuario está utilizando una app que consume muchos recursos, como jugar a un juego o ver un vídeo. Para mejorar la experiencia del usuario, Android 8.0 (nivel de API 26) impone limitaciones a lo que las aplicaciones pueden hacer mientras se ejecutan en segundo plano. Este documento describe los cambios en el sistema operativo, y cómo puedes actualizar tu app para que funcione bien bajo las nuevas limitaciones.

¿Qué es el servicio en android?

Primero refresquemos qué es el servicio en Android? Según la documentación de android:

Un Servicecomponente de aplicación que puede realizar operaciones de larga duración en segundo plano, y no proporciona una interfaz de usuario.

Así que, fundamentalmente el Servicio es lo mismo que la actividad pero no tiene el componente UI en él. Por lo tanto, no tiene que realizar una animación suave a 60 fps. Es por eso que puede ejecutar cualquier tarea por el período de tiempo más largo que la actividad.

Hay tres tipos de servicio:

  • Servicio Iniciado – Un servicio se inicia cuando un componente de la aplicación (como una actividad) llama a startService().
  • Servicio Vinculado – Un servicio está vinculado cuando un componente de la aplicación se vincula a él llamando a bindService().
  • Servicio programado – Un servicio está programado cuando una API como la JobScheduler.

Aplicaciones en segundo plano frente a aplicaciones en primer plano:

Para conocer los cambios de ejecución en segundo plano, necesitamos saber primero la diferencia entre aplicación en segundo plano y en primer plano.

Regla general, su aplicación será considerada como un servicio en primer plano si cualquiera de los tres casos siguientes son verdaderos:

  1. Su aplicación tiene actualmente actividad visible.
  2. Su aplicación tiene un servicio en primer plano en ejecución.
  3. Su aplicación está conectada a otra aplicación en primer plano vinculando el servicio o consumiendo sus proveedores de contenido.

Si alguno de los escenarios anteriores no es cierto en la instancia actual, se considera que tu aplicación está en segundo plano.

¿Por qué necesitamos restringir el uso de los servicios en segundo plano?

Cuando tus aplicaciones se ejecutan en segundo plano utilizando servicios, tu aplicación consume dos recursos preciosos: 1) Memoria y 2) Batería.

Estos dos son recursos limitados en los dispositivos móviles y la mayoría de los dispositivos de gama baja y media no tienen mucha memoria o batería en su interior.

Supongamos que su aplicación está haciendo algunas tareas muy intensivas en el fondo y el uso de la mayor cantidad de memoria RAM para llevar a cabo esa tarea, entonces esto va a crear la experiencia de usuario muy junky, especialmente si el usuario está utilizando otra aplicación de uso intensivo de recursos, tales como jugar un juego o ver un video en primer plano.

Según la documentación del servicio iniciado, la mejor práctica es,

Cuando la operación se completa, el servicio debe detenerse por sí mismo.

Pero, muchas aplicaciones tienen servicios de fondo de larga duración, que básicamente se ejecutan durante el tiempo infinito para mantener la conexión de socket con el servidor o supervisar algunas tareas o la actividad del usuario. Estos servicios crean el drenaje de la batería y también consumen constantemente la memoria.

Desde el último par de versiones de android (A partir de Marshmallow), Google está tratando muy duro para aumentar la vida de la batería y reducir el consumo de memoria utilizado por las aplicaciones mediante la introducción del modo doze y app standby retrasando la ejecución de fondo por una cierta cantidad de tiempo si el teléfono está inactivo.

Pero la mayoría de las veces a pesar de conocer las desventajas de los servicios de larga ejecución los desarrolladores siguen utilizándolos. (Sobre todo porque es fácil de implementar y mantener en lugar de utilizar otras soluciones).