Descripción general del trabajo en segundo plano

A menudo, las apps necesitan hacer más de una acción a la vez. Las APIs de Android ofrecen muchas formas diferentes de permitirte hacerlo. Elegir la opción correcta es muy importante. Una opción puede ser adecuada para una situación y muy incorrecta para otra. Elegir las APIs incorrectas puede afectar el rendimiento o la eficiencia de los recursos de tu app, lo que puede agotar la batería y degradar el rendimiento del dispositivo del usuario en su totalidad. En algunos casos, elegir el enfoque incorrecto podría impedir que tu app aparezca en Play Store.

En este documento, se explican las diferentes opciones disponibles y se brinda ayuda para elegir la más adecuada para tu situación.

Terminología

Algunos términos importantes relacionados con el trabajo en segundo plano pueden usarse de varias maneras contradictorias. Por esta razón, es importante definir nuestros términos.

Si una app se ejecuta en segundo plano, el sistema aplica una serie de restricciones. (Por ejemplo, en la mayoría de los casos, una app en segundo plano no puede iniciar servicios en primer plano).

Para los fines de este documento, usaremos el término "tarea" para indicar una operación que una app realiza fuera de su flujo de trabajo principal. Para garantizar la comprensión de la alineación, dividimos esto en tres categorías principales de tipos de tareas: trabajo asíncrono, trabajo en segundo plano y servicios en primer plano.

Elige la opción correcta

En la mayoría de las situaciones, puedes determinar las APIs adecuadas para usar en tu tarea. Para ello, debes determinar la categoría (trabajo asíncrono, trabajo en segundo plano o servicios en primer plano) en la que se encuentra la tarea.

Si aún no estás seguro, puedes usar los diagramas de flujo que proporcionamos, que agregan más matices a la decisión. Cada una de estas opciones se describe con más detalle más adelante en este documento.

Hay dos escenarios principales que se deben tener en cuenta para el trabajo en segundo plano:

Estos dos escenarios tienen sus propios árboles de decisión.

Trabajo asíncrono

En muchos casos, una app solo necesita realizar operaciones simultáneas mientras se ejecuta en primer plano. Por ejemplo, una app podría necesitar realizar un cálculo lento. Si realizara el cálculo en el subproceso de IU, el usuario no podría interactuar con la app hasta que finalice el cálculo, lo que podría generar un error de ANR. En un caso como este, la app debería usar una opción de trabajo asíncrono.

Las opciones comunes de trabajo asíncrono incluyen corrutinas de Kotlin y subprocesos de Java. Puedes encontrar más información en la documentación de trabajo asíncrono. Es importante tener en cuenta que, a diferencia del trabajo en segundo plano, no se garantiza que el trabajo asíncrono finalice si la app deja de estar en una etapa del ciclo de vida válida (por ejemplo, si la app sale del primer plano).

Ejecución en segundo plano

El trabajo en segundo plano es una opción más flexible cuando necesitas realizar tareas que deberían continuar incluso si el usuario abandona la app. En la mayoría de los casos, la mejor opción para realizar estas tareas es usar WorkManager, aunque en algunos casos puede ser apropiado usar la API de JobScheduler de la plataforma.

WorkManager es una biblioteca potente que te permite configurar trabajos simples o complicados según lo necesites. Puedes usar WorkManager para programar tareas que se ejecuten en momentos específicos o especificar las condiciones en las que deben ejecutarse. Incluso puedes configurar cadenas de tareas para que cada una se ejecute una vez y pasen sus resultados a la siguiente. Para comprender todas las opciones disponibles, lee la lista de funciones de WorkManager.

Estas son algunas de las situaciones más comunes de los trabajos en segundo plano:

  • Recuperar datos periódicamente del servidor
  • Recuperar datos del sensor (por ejemplo, datos del contador de pasos)
  • Cómo obtener datos de ubicación periódicos (debes tener el permiso ACCESS_BACKGROUND_LOCATION en Android 10 o versiones posteriores)
  • Subir contenido basado en un activador de contenido, como fotos creadas por la cámara

Servicios en primer plano

Los servicios en primer plano ofrecen una manera potente de ejecutar tareas de inmediato que no deberían interrumpirse. Sin embargo, los servicios en primer plano pueden suponer una gran carga para el dispositivo y, a veces, tienen implicaciones de privacidad y seguridad. Por estos motivos, el sistema impone muchas restricciones sobre cómo y cuándo las apps pueden usar los servicios en primer plano. Por ejemplo, un servicio en primer plano debe ser visible para el usuario y, en la mayoría de los casos, las apps no pueden iniciar servicios en primer plano cuando están en segundo plano. Para obtener más información, consulta la documentación de servicios en primer plano.

Existen dos métodos para crear un servicio en primer plano. Puedes declarar tu propio Service y especificar que el servicio es un servicio en primer plano llamando a Service.startForeground(). Como alternativa, puedes usar WorkManager para crear un servicio en primer plano, como se describe en Asistencia para trabajadores de larga duración. Sin embargo, es importante saber que un servicio en primer plano creado por WorkManager debe obedecer todas las mismas restricciones que cualquier otro servicio en primer plano. WorkManager solo proporciona algunas APIs de conveniencia para facilitar la creación de un servicio en primer plano.

APIs alternativas

El sistema ofrece APIs alternativas que están diseñadas para tener un mejor rendimiento en casos de uso más específicos. Si existe una API alternativa para tu caso de uso, te recomendamos que uses esa API en lugar de un servicio en primer plano, ya que debería ayudar a que la app tenga un mejor rendimiento. La documentación de los tipos de servicio en primer plano indica cuándo hay una buena API alternativa para usar en lugar de un tipo particular de servicio en primer plano.

Algunas de las situaciones más comunes para usar APIs alternativas son las siguientes:

Tareas que inicia el usuario

Diagrama de flujo en el que se muestra cómo elegir la API adecuada. Este gráfico resume el material de la sección "Tareas que inicia el usuario".
Figura 1: Cómo elegir la API correcta para ejecutar una tarea en segundo plano iniciada por el usuario.

Si una app necesita realizar una tarea en segundo plano, y el usuario inicia la operación mientras la app está visible, responde estas preguntas para encontrar el enfoque correcto.

¿La tarea debe seguir ejecutándose mientras la app está en segundo plano?

Si no es necesario que la tarea siga funcionando mientras la app está en segundo plano, debes usar el trabajo asíncrono. Existen varias opciones para realizar trabajo asíncrono. Lo importante que debes comprender es que estas opciones dejan de funcionar si la app pasa a segundo plano. (También se detienen si se cierra la app). Por ejemplo, es posible que una app de redes sociales quiera actualizar su feed de contenido, pero no necesite finalizar la operación si el usuario abandona la pantalla.

¿Habrá una mala experiencia del usuario si la tarea se aplaza o se interrumpe?

Es importante considerar si la experiencia del usuario no se verá afectada si se pospone o cancela una tarea. Por ejemplo, si una app necesita actualizar sus recursos, es posible que el usuario no note si la operación ocurre de inmediato o en la mitad de la noche, mientras el dispositivo se está recargando. En casos como este, debes usar las opciones de trabajo en segundo plano.

¿Es una tarea breve y crítica?

Si la tarea no se puede retrasar y se completará rápidamente, puedes usar un servicio en primer plano con el tipo shortService. Estos servicios son más fáciles de crear que otros servicios en primer plano y no requieren tantos permisos. Sin embargo, los servicios cortos deben completarse en tres minutos.

¿Existe una API alternativa solo para este propósito?

Si la tarea no es invisible para el usuario, la solución correcta puede ser usar un servicio en primer plano. Estos servicios se ejecutan de forma continua una vez que se inician, por lo que son una buena opción cuando interrumpir la tarea tendría una mala experiencia del usuario. Por ejemplo, una app de seguimiento de entrenamiento podría usar sensores de ubicación para permitir que los usuarios registren su ruta para trotar en un mapa. No querrás hacer esto con una opción de trabajo en segundo plano, ya que si la tarea se pausara, el seguimiento se detendría de inmediato. En una situación como esta, usar un servicio en primer plano tiene más sentido.

Sin embargo, debido a que los servicios en primer plano pueden usar una gran cantidad de recursos del dispositivo, el sistema impone muchas restricciones sobre cuándo y cómo pueden usarse. En muchos casos, en lugar de usar un servicio en primer plano, puedes usar una API alternativa que maneje la tarea por ti con menos problemas. Por ejemplo, si tu app necesita realizar una acción cuando el usuario llega a una ubicación determinada, la mejor opción es usar la API de geovallado en lugar de hacer un seguimiento de la ubicación del usuario con un servicio en primer plano.

Tareas en respuesta a un evento

Diagrama de flujo en el que se muestra cómo elegir la API adecuada. En este gráfico, se resume el material de la sección "Tareas en respuesta a un evento".
Figura 2: Cómo elegir la API adecuada para ejecutar una tarea en segundo plano activada por eventos

Algunas veces, una app necesita realizar trabajos en segundo plano en respuesta a un activador, por ejemplo:

Puede ser un activador externo (como un mensaje de FCM) o podría ser la respuesta a una alarma que estableció la app. Por ejemplo, un juego puede recibir un mensaje de FCM que le solicita que actualice algunos elementos.

Si puedes estar seguro de que la tarea finalizará en unos segundos, usa el trabajo asíncrono para realizarla. El sistema le permitirá a tu app unos segundos para realizar cualquiera de esas tareas, incluso si estaba en segundo plano.

Si la tarea tardará más de unos segundos, puede ser conveniente iniciar un servicio en primer plano para controlarla. De hecho, incluso si la app está en segundo plano, es posible que se le permita iniciar un servicio en primer plano si el usuario activó la tarea y se encuentra dentro de una de las exenciones de las restricciones de inicio en segundo plano aprobadas. Por ejemplo, si una app recibe un mensaje de FCM de alta prioridad, puede iniciar un servicio en primer plano incluso si está en segundo plano.

Si la tarea demora más de unos segundos, usa el trabajo en segundo plano.