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 la app se ejecuta en segundo plano:

Hay varias opciones de compatibilidad para cada uno de estos casos de uso. Cada uno tiene ventajas y desventajas que podrían hacer que sea más o menos adecuado para tus necesidades específicas.

En el siguiente diagrama, se muestra una vista simplificada de la guía de esta página:

Buscar un dispositivo

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

En segundo plano

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

Conectarse a un dispositivo

Si quieres conectarte a un dispositivo después de haberlo encontrado, debes obtener una instancia de BluetoothDevice para el dispositivo desde una de las siguientes fuentes:

Después de tener una instancia de BluetoothDevice, puedes 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. 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 que se produzca una desconexión por parte del periférico o porque este se encuentra fuera del 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 está en segundo plano, aunque la conexión se cierra si el proceso se cierra. Además, existen restricciones para iniciar actividades (en Android 10 y versiones posteriores) o servicios en primer plano (en Android 12 y versiones posteriores) en segundo plano.

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

Mantente conectado a un dispositivo

Lo ideal sería que las apps mantengan conexiones con dispositivos periféricos solo el tiempo necesario y se desconecten una vez que se complete la tarea. Sin embargo, existen 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:

Al cambiar de app

Encontrar un dispositivo, conectarse a él y transferir datos requiere mucho tiempo y recursos. Para evitar perder la conexión y tener que realizar todo el proceso cada vez que el usuario cambie de app o realice 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. Para la mayoría de las apps, es mejor admitir este caso de uso con CompanionDeviceService, ya que es probable que la app necesite 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 que finalizó un proceso siguiendo las instrucciones de la sección Cómo conectarse a un dispositivo.