Communication en arrière-plan

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 :

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 :

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 :

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 :

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 :

Dans les deux cas, les options suivantes sont disponibles :

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.