Ce guide explique comment prendre en charge les principaux cas d'utilisation de la communication 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 d'entre elles 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 la section Trouver des appareils BLE. (Exemple)CompanionDeviceManager
comme décrit dans la section Association d'appareils associés. (Exemple)
En arrière-plan
Il n'existe aucune limite concernant l'utilisation de l'une ou l'autre de ces API lorsque l'application n'est pas visible, mais elles ont toutes 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 suivantes:
- Pour
BluetoothLeScanner
: appelezstartScan()
avec un objetPendingIntent
au lieu d'un objetScanCallback
pour être averti lorsqu'un appareil correspondant à votre filtre est analysé. (Exemple) - Pour
CompanionDeviceManager
: suivez les instructions de la section Laisser les applications associées activées pour activer l'application et la maintenir activée 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 requête de connexion à l'appareil correspondant en appelant l'une des méthodes connectGatt()
. La valeur que vous transmettez dans la valeur booléenne autoConnect
définit lequel des deux modes de connexion suivants le client GATT utilise:
- Direct Connect (
autoconnect = false
) (Connexion directe): tente de se connecter directement au périphérique et échoue s'il n'est pas disponible. En cas de déconnexion, le client GATT n'essaie pas automatiquement de se reconnecter. - Connexion automatique (
autoconnect = true
): tente de se connecter automatiquement au périphérique dès qu'il est disponible. En cas de déconnexion déclenché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é. En outre, des restrictions s'appliquent au démarrage des activités (sur Android 10 et versions ultérieures) ou aux services de premier plan (sous Android 12 et versions ultérieures) 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 élément
PeriodicWorkRequest
ouOneTimeWorkRequest
pour effectuer une action définie, bien que des restrictions d'application puissent s'appliquer. - En outre, 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 active le plus longtemps possible pour effectuer une tâche, telle que la synchronisation de 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 élément
- Démarrez un service de premier plan avec le type
connectedDevice
.- Si la connexion doit être maintenue active le plus longtemps possible pour effectuer une tâche, telle que la synchronisation de 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 activer votre processus lorsque l'appareil est présent. Le périphérique doit être publicitaire.- Nous vous recommandons de démarrer un worker et une tâche. Elle peut être interrompue 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
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
Idéalement, les applications doivent maintenir les connexions aux périphériques aussi longtemps que 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 les notifications des 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 exécutée 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 les données sont des processus chronophages et gourmands en ressources. Pour éviter de perdre la connexion et de devoir exécuter 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 active 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 d'appareils associés.
En écoutant les 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 de la musique 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 l'arrêt d'un processus en suivant les instructions de la section Se connecter à un appareil.