Descripción general de las tareas en segundo plano

Con frecuencia, las apps necesitan hacer más de una cosa a la vez. Las APIs de Android proporcionan muchas formas diferentes de permitirte hacerlo. Elegir la opción correcta es muy importante. Una opción puede ser correcta para una situación, pero muy incorrecta para otra. Elegir las APIs incorrectas puede afectar el rendimiento de la app o la eficiencia de los recursos, 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 te ayuda a elegir la adecuada para tu situación.

Terminología

Algunos términos importantes relacionados con las tareas en segundo plano se pueden usar 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 referirnos a una operación que una app realiza fuera de su flujo de trabajo principal. Para garantizar la comprensión, reorganizamos estas categorías en tres categorías principales de tipos de tareas: trabajo asíncrono, APIs de programación de tareas y servicios en primer plano.

Elige la opción correcta

En la mayoría de los casos, puedes determinar las APIs adecuadas para usar en tu tarea determinando la categoría (trabajo asíncrono, las APIs de programación de tareas o los 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 situaciones principales que se deben considerar para las tareas 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 hacer un cálculo lento. Si se realiza el cálculo en el subproceso de IU, el usuario no podrá interactuar con la app hasta que finalice el cálculo. Esto podría generar un error de ANR. En un caso como este, la app debe usar una opción de trabajo asíncrono.

Entre las opciones comunes de trabajo asíncrono, se incluyen las corrutinas de Kotlin y los subprocesos de Java. Puedes encontrar más información en la documentación del trabajo asíncrono. Es importante tener en cuenta que, a diferencia de las APIs de tareas 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).

APIs de programación de tareas

Las APIs de programación de tareas son una opción más flexible cuando necesitas realizar tareas que deben continuar incluso si el usuario sale de la app. En la mayoría de los casos, la mejor opción para ejecutar tareas en segundo plano 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 sea necesario. Puedes usar WorkManager para programar tareas que se ejecuten en momentos específicos o especificar las condiciones en las que se deben ejecutar. Incluso puedes configurar cadenas de tareas para que cada una se ejecute de a una y se pasen los resultados a la siguiente. Para comprender todas las opciones disponibles, lee la lista de funciones de WorkManager.

Algunas de las situaciones más comunes para las tareas en segundo plano incluyen las siguientes:

  • Recuperar datos del servidor de forma periódica
  • Recuperar datos del sensor (por ejemplo, datos del contador de pasos)
  • 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 deben interrumpirse. Sin embargo, los servicios en primer plano pueden suponer una gran carga para el dispositivo y, en ocasiones, tienen implicaciones de privacidad y seguridad. Por estos motivos, el sistema impone muchas restricciones sobre cómo y cuándo las apps pueden usar 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 explica en Compatibilidad con trabajadores de larga duración. Sin embargo, es importante saber que un servicio en primer plano creado por WorkManager debe obedecer las mismas restricciones que cualquier otro servicio en primer plano. WorkManager solo proporciona algunas APIs convenientes 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 la uses en lugar de un servicio en primer plano, ya que esto debería mejorar el rendimiento de la app. En la documentación de los tipos de servicio en primer plano se indica cuándo hay una buena API alternativa para usar en lugar de un tipo de servicio en primer plano en particular.

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. En este gráfico, se resume el material de la sección "Tareas iniciadas por 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 tareas 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 se siga ejecutando mientras la app está en segundo plano, debes usar el trabajo asíncrono. Hay varias opciones para realizar trabajos asíncronos. Lo importante que debes comprender es que todas estas opciones dejan de funcionar si la app pasa a segundo plano. (También se detienen si se cierra la app). Por ejemplo, una app de redes sociales podría querer actualizar su feed de contenido, pero no necesitaría 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 se vería afectada si una tarea se pospone o cancela. Por ejemplo, si una app necesita actualizar sus recursos, es posible que el usuario no note si la operación se lleva a cabo de inmediato o en la mitad de la noche, mientras el dispositivo se recarga. 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 se interrumpe la tarea y tienen 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 hacerlo 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, un servicio en primer plano tiene más sentido.

Sin embargo, debido a que los servicios en primer plano pueden usar muchos recursos del dispositivo, el sistema impone muchas restricciones sobre cuándo y cómo se pueden usar. En muchos casos, en lugar de usar un servicio en primer plano, puedes usar una API alternativa que maneje el trabajo 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 correcta para ejecutar una tarea en segundo plano activada por eventos.

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

Puede ser un activador externo (como un mensaje de FCM) o que sea en respuesta a una alarma que haya establecido la app. Por ejemplo, un juego podría recibir un mensaje de FCM que le indica que actualice algunos recursos.

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

Si la tarea tardará más de unos segundos, quizás sea conveniente iniciar un servicio en primer plano para controlarla. De hecho, incluso si tu 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 tardará más de unos segundos, usa las APIs de programación de tareas.