Communication en arrière-plan

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:

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:

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:

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:

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:

Dans les deux cas, les options suivantes sont disponibles:

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.