Limitaciones del servicio en segundo plano de Android O
Google acaba de lanzar la vista previa de la tecnología Android O Para mejorar la duración de la batería y reducir el consumo de energía, Android limita aún más el funcionamiento de los servicios en segundo plano. Este artículo le presentará las nuevas restricciones del servicio en segundo plano de Android O. Está traducido del Blog para desarrolladores de Android O. El texto original está aquí.
Cuando una aplicación se ejecuta en segundo plano, seguirá ocupando memoria del sistema. Si hay muchas aplicaciones ejecutándose en segundo plano y el usuario está jugando o viendo videos, es fácil que el sistema se congele. Para mejorar la experiencia del usuario, Android O agrega restricciones a las aplicaciones en segundo plano. Este artículo presentará las restricciones del sistema sobre la ejecución de aplicaciones en segundo plano y cómo los desarrolladores deben modificar sus aplicaciones para adaptarse a esta restricción.
En el sistema Android se pueden ejecutar muchas aplicaciones y servicios al mismo tiempo. Por ejemplo, los usuarios pueden jugar en una ventana, navegar por la web en otra y escuchar música en una tercera aplicación. Cuantas más aplicaciones se ejecuten simultáneamente, mayor será la carga del sistema. Si hay otras aplicaciones o servicios ejecutándose en segundo plano, aumentará la carga en el sistema, lo que eventualmente provocará que el sistema se congele y afecte la experiencia del usuario. Por ejemplo, la música que se reproduce se detiene repentinamente.
Para reducir el retraso del sistema, Android O restringe la ejecución de aplicaciones con las que los usuarios ya no interactúan directamente. Para las aplicaciones cuyo targetSdkVersion es Android O, Android agrega restricciones de las dos maneras siguientes:
En la mayoría de los casos, las aplicaciones pueden usar JobScheduler Jobs para eludir las restricciones anteriores. Incluso si la aplicación no se está ejecutando, la aplicación puede programar los trabajos de JobScheduler para realizar ciertas tareas, y el sistema programará la ejecución de estos trabajos sin afectar la experiencia del usuario.
Los servicios en segundo plano ocuparán recursos del sistema, lo que provocará una mala experiencia de usuario. Para resolver este problema, Android O agrega un montón de restricciones a los servicios en segundo plano de las aplicaciones. Tenga en cuenta que estas restricciones son solo para aplicaciones con targetSdkVersion de Android O. Las aplicaciones con targetSdkVersion de 25 o inferior no se ven afectadas.
El sistema distingue entre aplicaciones en primer plano y en segundo plano. Cuando se cumple cualquiera de las siguientes condiciones, el sistema determina que la aplicación es una aplicación en primer plano:
Si no se cumple ninguna de las condiciones anteriores, el sistema considera la aplicación como una aplicación en segundo plano.
Las aplicaciones en primer plano pueden ejecutar libremente servicios en primer plano y en segundo plano. Después de que la aplicación pasa a segundo plano, todavía tiene una ventana de varios minutos para que el servicio esté en funcionamiento. Cuando expira este período de tiempo, la aplicación entra en estado inactivo y el sistema detendrá la ejecución del servicio en segundo plano de la aplicación. Esta operación es similar a la llamada al método Service.stopSelf() del servicio.
En algunos casos, las aplicaciones en segundo plano se agregarán temporalmente a la lista blanca para que se ejecuten durante unos minutos. Cuando una aplicación está en la lista blanca, puede iniciar servicios sin restricciones y también se ejecutan servicios en segundo plano. La aplicación se agregará a la lista blanca cuando necesite manejar tareas visibles para el usuario, como por ejemplo:
La mayoría de las veces, su aplicación puede reemplazar el servicio en segundo plano con un JobScheduler. Por ejemplo, CoolPhotoApp necesita comprobar si el usuario ha recibido imágenes compartidas por amigos, incluso si la aplicación no se está ejecutando en primer plano. Según la práctica anterior, la aplicación necesita utilizar un servicio en segundo plano para realizar esta tarea. Después de actualizar a Android O, los desarrolladores deben reemplazar el servicio en segundo plano con un trabajo que se ejecuta en un período determinado, consultar el servidor y salir una vez completado.
Antes de Android O, la forma común de crear un servicio en primer plano era crear primero un servicio en segundo plano y luego promoverlo al primer plano. Pero este enfoque ha caducado en Android O.
Android O proporciona otro método [NotificationManager.startServiceInForeground()](/reference/android/app/NotificationManager.html#startServiceInForeground(android.content.Intent, int, android.app.Notification)) para crear un servicio en primer plano. Los nuevos servicios creados con este método nunca pasarán a segundo plano, por lo que no estarán restringidos por el funcionamiento de los servicios en segundo plano.
Si la aplicación registra una transmisión, mientras se envíe una transmisión, el receptor de transmisión de la aplicación se ejecutará automáticamente y ocupará recursos del sistema. Cuando muchas aplicaciones registran la transmisión de un evento del sistema, se producirán problemas de rendimiento, porque cuando un evento del sistema activa una transmisión, todos los receptores de aplicaciones se ejecutarán secuencialmente en un corto período de tiempo, lo que afectará la experiencia del usuario. Para solucionar este problema, Android 7.0 añade restricciones en las retransmisiones. Android O refuerza aún más esta limitación.
En la mayoría de los casos, la transmisión implícita previamente registrada por la aplicación puede ser reemplazada por un trabajo JobScheduler con funcionalidad similar. Por ejemplo, una aplicación social basada en fotografías a menudo borra los datos generados durante el uso cuando el dispositivo se está cargando. La aplicación registrará la transmisión ACTION_POWER_CONNECTED en el Manifiesto. Al recibir esta transmisión, realizará un trabajo de limpieza. Al actualizar a Android O, la aplicación debe eliminar la transmisión registrada y luego usar un trabajo de limpieza. Este trabajo activará automáticamente la ejecución cuando el dispositivo esté inactivo y cargándose.
Algunas transmisiones implícitas no están sujetas a esta restricción y la aplicación puede continuar registrándose y utilizándose en el Manifiesto, independientemente de la targetSdkVersion de la aplicación. Para transmisiones sin restricciones, consulte Excepciones de transmisión implícitas.
Los cambios introducidos anteriormente no afectarán a las aplicaciones cuyo targetSdkVersion sea 25 o inferior. Pero si el targetSdkVersion de la aplicación es el nivel API correspondiente a Android O, la aplicación debe modificarse para cumplir con estas nuevas restricciones.
Si su aplicación todavía ejecuta servicios en segundo plano cuando está inactiva, debe reemplazar estos servicios en segundo plano. Se puede adoptar la siguiente solución:
Verificar la transmisión registrada en Manifest y reemplazar la transmisión implícita: