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:
- Cómo encontrar un dispositivo
- Cómo conectarse a un dispositivo
- Mantén la conexión con un dispositivo
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:
BluetoothLeScanner, como se describe en Cómo buscar dispositivos BLE. (Muestra)CompanionDeviceManager, como se describe en Vinculación de dispositivos complementarios. (Muestra)
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:
- Para
BluetoothLeScanner: Llama astartScan()con un objetoPendingIntenten lugar de un objetoScanCallbackpara recibir una notificación cuando se escanee un dispositivo que coincida con tu filtro. (Muestra) - Para
CompanionDeviceManager: Sigue las instrucciones que se indican en Cómo mantener activas las apps complementarias para activar la app y mantenerla activa mientras un dispositivo asociado previamente esté dentro del alcance. (Muestra)
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:
- Un resultado de análisis de
BluetoothLeScannercomo se describe en la sección anterior. - La lista de dispositivos vinculados recuperada de
BluetoothAdapter.getBondedDevices() - La caché de
BluetoothAdapter, conBluetoothAdapter.getRemoteLeDevice().
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:
- Usa WorkManager para conectarte a tu dispositivo.
- Puedes configurar un
PeriodicWorkRequesto unOneTimeWorkRequestpara realizar una acción definida, aunque es posible que se apliquen restricciones de la app. - Además, puedes aprovechar las funciones de WorkManager, como las restricciones de trabajo, el trabajo acelerado, la política de reintentos y mucho más.
- Si la conexión debe mantenerse activa el mayor tiempo posible para realizar una tarea, como la sincronización de datos o el sondeo desde los dispositivos periféricos, debes iniciar un servicio en primer plano siguiendo las instrucciones de Compatibilidad con trabajadores de larga duración. Sin embargo, las restricciones para el inicio del servicio en primer plano se aplican a partir de Android 12.
- Puedes configurar un
- Inicia un servicio en primer plano con el tipo
connectedDevice.- Si la conexión debe mantenerse activa el mayor tiempo posible para realizar una tarea, como la sincronización de datos o el sondeo desde los dispositivos periféricos, debes iniciar un servicio en primer plano siguiendo las instrucciones de Compatibilidad con trabajadores de larga duración. Sin embargo, las restricciones para el inicio del servicio en primer plano se aplican a partir de Android 12.
- Llama a
startScan()con un objetoPendingIntent, como se describe en Cómo encontrar un dispositivo, para activar tu proceso cuando el dispositivo esté presente. El dispositivo periférico debe estar anunciando.- Te recomendamos que inicies un Worker y un Job. El sistema puede interrumpir este proceso y, por lo tanto, solo puede admitir comunicaciones de corta duración.
- En las versiones anteriores a Android 12, puedes iniciar un servicio en primer plano directamente desde el objeto
PendingIntent.
- Usa
CompanionDeviceServicey los permisosREQUEST_COMPANION_RUN_IN_BACKGROUNDoREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDpara iniciar el servicio desde el segundo plano.
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:
- Usa
CompanionDeviceServicecon el permisoREQUEST_COMPANION_RUN_IN_BACKGROUNDy el métodoCompanionDeviceManager.startObservingDevicePresence(). - Inicia un servicio en primer plano mientras la app está en primer plano (o dentro de una de las excepciones) con el tipo de primer plano
connectedDevice.
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.