Comunícate en segundo plano

En esta guía, se proporciona una descripción general de cómo admitir casos de uso clave para comunicarse con dispositivos periféricos cuando tu app se ejecuta en segundo plano:

Existen varias opciones para admitir cada uno de estos casos de uso. Cada una tiene ventajas y desventajas que pueden hacer que sea más o menos adecuada para tus necesidades específicas.

En el siguiente diagrama, se muestra una vista simplificada de la orientación de esta página:

Buscar un dispositivo

Primero, tu app debe encontrar un dispositivo al que conectarse. Para encontrar un dispositivo BLE, puedes usar cualquiera de las siguientes APIs:

En segundo plano

No hay limitaciones para usar ninguna de estas APIs mientras la app no está visible, pero ambas necesitan que el proceso de la app esté activo. Si el proceso de la app no se está ejecutando, puedes usar las siguientes soluciones alternativas:

Conectarse a un dispositivo

Para conectarte a un dispositivo después de encontrarlo, debes obtener una instancia de BluetoothDevice para el dispositivo de una de las siguientes fuentes:

Una vez que tengas una instancia de BluetoothDevice, podrás iniciar una solicitud de conexión al dispositivo correspondiente llamando a uno de los métodos connectGatt(). El valor que pasas al booleano autoConnect define cuál de los siguientes dos modos de conexión usa el cliente GATT:

  • Conexión directa (autoconnect = false): Intenta conectarte al dispositivo periférico directamente y falla si el dispositivo no está disponible. En caso de desconexión, el cliente GATT no intenta volver a conectarse automáticamente.
  • Conexión automática (autoconnect = true): Intenta conectarte automáticamente al dispositivo periférico cuando esté disponible. En caso de una desconexión iniciada por el periférico o porque este está fuera de alcance, el cliente GATT intenta volver a conectarse automáticamente cuando el periférico está disponible.

En segundo plano

No hay restricciones para conectarse a un dispositivo mientras la app se ejecuta en segundo plano, aunque la conexión se cierra si se finaliza el proceso. Además, existen restricciones para iniciar actividades (en Android 10 y versiones posteriores) o servicios en primer plano (en Android 12 y versiones posteriores) desde el segundo plano.

Por lo tanto, para realizar una conexión mientras se ejecuta en segundo plano, las apps pueden usar las siguientes soluciones:

Mantén la conexión a un dispositivo

Lo ideal es que las apps mantengan las conexiones con los dispositivos periféricos solo durante el tiempo necesario y se desconecten una vez que se complete la tarea. Sin embargo, hay dos casos en los que una app podría necesitar mantener una conexión activa de forma indefinida:

En ambos casos, están disponibles las siguientes opciones:

Mientras cambias de app

Encontrar un dispositivo, conectarse a él y transferir datos consume mucho tiempo y recursos. Para evitar perder la conexión y tener que realizar todo el proceso cada vez que el usuario cambia de app o realiza tareas simultáneas, debes mantener la conexión activa hasta que finalice la operación. Puedes usar un servicio en primer plano con el tipo connectedDevice o la API de presencia de dispositivo complementario.

Mientras se escuchan las notificaciones de periféricos

Para escuchar las notificaciones de periféricos, la app debe llamar a setCharacteristicNotification(), escuchar las devoluciones de llamada con onCharacteristicChanged() y mantener activa la conexión. En la mayoría de las apps, es mejor admitir este caso de uso con CompanionDeviceService, ya que es probable que la app deba seguir escuchando durante períodos prolongados. Sin embargo, también puedes usar un servicio en primer plano.

En cualquier caso, puedes volver a conectarte después de un proceso finalizado siguiendo las instrucciones de la sección Cómo conectarse a un dispositivo.