Ce guide explique comment prendre en charge les principaux cas d'utilisation de la communication avec les 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. Chacun présente des avantages et des inconvénients qui peuvent le rendre plus ou moins adapté à 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 la section Rechercher des appareils BLE. (Exemple)CompanionDeviceManager
, comme décrit dans la section Associer un appareil compagnon. (Exemple)
En arrière-plan
L'utilisation de l'une ou l'autre de ces API n'est pas limitée lorsque l'application n'est pas visible, mais elles ont toutes les deux besoin 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 objetPendingIntent
au lieu d'un objetScanCallback
pour être averti lorsqu'un appareil correspondant à votre filtre est scanné. (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é se trouve à portée. (Exemple)
Connexion à un appareil
Pour vous connecter à un appareil après l'avoir détecté, vous devez obtenir une instance BluetoothDevice
pour l'appareil à partir de l'une des sources suivantes:
- 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 démarrer une requête de connexion à l'appareil correspondant en appelant l'une des méthodes connectGatt()
. La valeur que vous transmettez à la valeur booléenne autoConnect
définit l'un des deux modes de connexion suivants utilisés par le client GATT:
- Connexion directe (
autoconnect = false
): tentez de vous connecter directement à l'appareil périphérique et échouez si l'appareil n'est pas disponible. En cas de déconnexion, le client GATT ne tente pas automatiquement de se reconnecter. - Connexion automatique (
autoconnect = true
): tente de se connecter automatiquement à l'appareil périphérique chaque fois qu'il est disponible. En cas de déconnexion initiée par le périphérique ou parce qu'il 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 en arrière-plan, bien que la connexion soit fermée si votre processus est arrêté. De plus, des restrictions s'appliquent au démarrage d'activités (sous Android 10 et versions ultérieures) ou de services de premier plan (sous Android 12 et versions ultérieures) en arrière-plan.
Par conséquent, pour effectuer 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
PeriodicWorkRequest
ou unOneTimeWorkRequest
pour effectuer une action définie, bien que des restrictions d'application puissent s'appliquer. - De plus, vous pouvez profiter des fonctionnalités WorkManager telles que les contraintes de travail, le travail accéléré, 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 de données ou l'interrogation à partir des périphériques, vous devez démarrer un service de premier plan en suivant les conseils de la section Compatibilité avec les workers 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 de données ou l'interrogation à partir des périphériques, vous devez démarrer un service de premier plan en suivant les conseils de la section Compatibilité avec les workers 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éveiller votre processus lorsque l'appareil est présent. L'appareil périphérique doit diffuser des annonces.- Nous vous recommandons de démarrer un nœud de calcul et une tâche. Cela peut être interrompu par le système et ne peut donc prendre en charge que des 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
CompanionDeviceService
et l'une des autorisationsREQUEST_COMPANION_RUN_IN_BACKGROUND
ouREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
pour 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 où une application peut avoir besoin de maintenir une connexion active indéfiniment:
- Lorsque vous passez d'une application à une autre
- Lorsque vous écoutez des notifications de périphériques
Dans les deux cas, les options suivantes sont disponibles:
- Utilisez
CompanionDeviceService
avec l'autorisationREQUEST_COMPANION_RUN_IN_BACKGROUND
et 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
.
Lorsque vous passez d'une application à une autre
Trouver un appareil, s'y connecter et transférer des données prend du temps et demande beaucoup de ressources. Pour éviter de perdre la connexion et d'avoir à effectuer l'ensemble du processus chaque fois que l'utilisateur passe d'une application à une autre ou effectue des tâches simultanées, vous devez maintenir la connexion jusqu'à la fin de l'opération. Vous pouvez utiliser un service de premier plan avec le type connectedDevice
ou l'API de présence de l'appareil compagnon.
Lorsque vous écoutez des notifications de périphérique
Pour écouter les notifications 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. Vous pouvez toutefois é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.