Ce guide explique comment prendre en charge les principaux cas d'utilisation pour communiquer avec des périphériques lorsque votre application s'exécute en arrière-plan :
Il existe plusieurs options pour prendre en charge chacun de ces cas d'utilisation. Chacune présente des avantages et des inconvénients qui peuvent la rendre plus ou moins adaptée à vos besoins spécifiques.
Le schéma suivant présente une vue simplifiée des conseils de cette page :

Trouver un appareil
Tout d'abord, votre application doit trouver un appareil auquel se connecter. Pour trouver un appareil BLE, vous pouvez utiliser l'une des API suivantes :
BluetoothLeScanner, comme décrit dans Rechercher des appareils BLE. (Exemple)CompanionDeviceManager, comme décrit dans Association d'appareils associés. (Exemple)
En arrière-plan
Il n'y a aucune restriction quant à l'utilisation de l'une ou l'autre de ces API lorsque l'application n'est pas visible, mais elles nécessitent toutes deux que le processus de votre application soit actif. Si le processus de l'application n'est pas en cours d'exécution, vous pouvez utiliser les solutions de contournement suivantes :
- Pour
BluetoothLeScanner: appelezstartScan()avec un objetPendingIntentau lieu d'un objetScanCallbackpour être averti lorsqu'un appareil correspondant à votre filtre est analysé. (Exemple) - Pour
CompanionDeviceManager: suivez les instructions de la section Maintenir les applications associées actives pour activer l'application et la maintenir active lorsqu'un appareil précédemment associé est à portée. (Exemple)
Connexion à un appareil
Pour vous connecter à un appareil après l'avoir trouvé, vous devez obtenir une instance BluetoothDevice pour l'appareil à partir de l'une des sources suivantes :
- Un résultat d'analyse
BluetoothLeScanner, comme décrit dans la section précédente. - Liste des appareils associés récupérée à partir de
BluetoothAdapter.getBondedDevices(). - Le cache
BluetoothAdapter, à l'aide deBluetoothAdapter.getRemoteLeDevice().
Une fois que vous disposez d'une instance BluetoothDevice, vous pouvez lancer une demande de connexion à l'appareil correspondant en appelant l'une des méthodes connectGatt(). La valeur que vous transmettez au booléen autoConnect définit lequel des deux modes de connexion suivants est utilisé par le client GATT :
- Connexion directe (
autoconnect = false) : tente de se connecter directement au périphérique et échoue si l'appareil n'est pas disponible. En cas de déconnexion, le client GATT ne tente pas de se reconnecter automatiquement. - Connexion automatique (
autoconnect = true) : tente de se connecter automatiquement au périphérique dès qu'il est disponible. En cas de déconnexion initiée par le périphérique ou parce que le périphérique est hors de portée, le client GATT tente automatiquement de se reconnecter lorsque le périphérique est disponible.
En arrière-plan
Il n'existe aucune restriction concernant la connexion à un appareil lorsque l'application est exécutée en arrière-plan, bien que la connexion soit fermée si votre processus est arrêté. De plus, il existe des restrictions concernant le démarrage d'activités (sous Android 10 ou version ultérieure) ou de services de premier plan (sous Android 12 ou version ultérieure) en arrière-plan.
Ainsi, pour établir une connexion en arrière-plan, les applications peuvent utiliser les solutions suivantes :
- Utilisez WorkManager pour vous connecter à votre appareil.
- Vous pouvez définir un
PeriodicWorkRequestou unOneTimeWorkRequestpour effectuer une action définie, bien que des restrictions d'application puissent s'appliquer. - De plus, vous pouvez bénéficier des fonctionnalités de WorkManager, telles que les contraintes de travail, les tâches prioritaires, la règle de nouvelle tentative, etc.
- Si la connexion doit être maintenue aussi longtemps que possible pour effectuer une tâche, telle que la synchronisation des données ou l'interrogation des périphériques, vous devez démarrer un service de premier plan en suivant les instructions de la section Compatibilité avec les nœuds de calcul de longue durée. Toutefois, les restrictions de lancement des services de premier plan s'appliquent à partir d'Android 12.
- Vous pouvez définir un
- Démarrez un service de premier plan avec le type
connectedDevice.- Si la connexion doit être maintenue aussi longtemps que possible pour effectuer une tâche, telle que la synchronisation des données ou l'interrogation des périphériques, vous devez démarrer un service de premier plan en suivant les instructions de la section Compatibilité avec les nœuds de calcul de longue durée. Toutefois, les restrictions de lancement des services de premier plan s'appliquent à partir d'Android 12.
- Appelez
startScan()avec un objetPendingIntent, comme décrit dans Rechercher un appareil, pour réactiver votre processus lorsque l'appareil est présent. Le périphérique doit diffuser des annonces.- Nous vous recommandons de démarrer un nœud de calcul et un job. Il peut être interrompu par le système et ne peut donc prendre en charge que les communications de courte durée.
- Dans les versions antérieures à Android 12, vous pouvez démarrer un service de premier plan directement à partir de l'objet
PendingIntent.
- Utilisez
CompanionDeviceServiceet l'autorisationREQUEST_COMPANION_RUN_IN_BACKGROUNDouREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDpour démarrer le service en arrière-plan.
Rester connecté à un appareil
Dans l'idéal, les applications ne doivent maintenir les connexions aux périphériques que le temps nécessaire et se déconnecter une fois la tâche terminée. Toutefois, il existe deux cas dans lesquels une application peut avoir besoin de maintenir une connexion active indéfiniment :
- Lorsque vous passez d'une application à une autre
- Pendant l'écoute des notifications des périphériques
Dans les deux cas, les options suivantes sont disponibles :
- Utilisez
CompanionDeviceServiceavec l'autorisationREQUEST_COMPANION_RUN_IN_BACKGROUNDet la méthodeCompanionDeviceManager.startObservingDevicePresence(). - Démarrez un service de premier plan lorsque l'application est au premier plan (ou dans l'une des exceptions) avec le type de premier plan
connectedDevice.
En passant d'une application à une autre
Rechercher un appareil, s'y connecter et transférer des données prend du temps et consomme beaucoup de ressources. Pour éviter de perdre la connexion et de devoir effectuer l'intégralité du processus chaque fois que l'utilisateur passe d'une application à l'autre ou effectue des tâches simultanées, vous devez maintenir la connexion active jusqu'à la fin de l'opération. Vous pouvez utiliser un service de premier plan avec le type connectedDevice ou l'API Companion Device Presence.
Pendant l'écoute des notifications des périphériques
Pour écouter les notifications des périphériques, l'application doit appeler setCharacteristicNotification(), écouter les rappels à l'aide de onCharacteristicChanged() et maintenir la connexion active. Pour la plupart des applications, il est préférable de prendre en charge ce cas d'utilisation avec CompanionDeviceService, car l'application devra probablement continuer à écouter pendant de longues périodes. Toutefois, vous pouvez également utiliser un service de premier plan.
Dans les deux cas, vous pouvez vous reconnecter après un processus arrêté en suivant les instructions de la section Se connecter à un appareil.