Im Hintergrund kommunizieren

In diesem Leitfaden erhalten Sie einen Überblick darüber, wie Sie wichtige Anwendungsfälle für die Kommunikation mit Peripheriegeräten unterstützen, wenn Ihre App im Hintergrund ausgeführt wird:

Für jeden dieser Anwendungsfälle gibt es mehrere Optionen. Jede hat Vor- und Nachteile, die sie für Ihre spezifischen Anforderungen mehr oder weniger geeignet machen.

Das folgende Diagramm zeigt eine vereinfachte Ansicht der Anleitung auf dieser Seite:

Gerät finden

Zuerst muss Ihre App ein Gerät finden, mit dem eine Verbindung hergestellt werden kann. Sie können eine der folgenden APIs verwenden, um ein BLE-Gerät zu finden:

Im Hintergrund

Die Verwendung dieser APIs ist nicht eingeschränkt, wenn die App nicht sichtbar ist. Allerdings muss der App-Prozess für beide APIs aktiv sein. Wenn der App-Prozess nicht ausgeführt wird, können Sie eine der folgenden Problemumgehungen verwenden:

  • Für BluetoothLeScanner: Rufen Sie startScan() mit einem PendingIntent-Objekt anstelle eines ScanCallback-Objekts auf, um benachrichtigt zu werden, wenn ein Gerät gescannt wird, das Ihrem Filter entspricht. (Beispiel)
  • Für CompanionDeviceManager: Folgen Sie der Anleitung unter Companion-Apps aktiv halten, um die App zu aktivieren und aktiv zu halten, solange sich ein zuvor verknüpftes Gerät in Reichweite befindet. (Beispiel)

Mit einem Gerät verbinden

Wenn Sie eine Verbindung zu einem Gerät herstellen möchten, nachdem Sie es gefunden haben, müssen Sie eine BluetoothDevice-Instanz für das Gerät aus einer der folgenden Quellen abrufen:

Nachdem Sie eine BluetoothDevice-Instanz haben, können Sie eine Verbindungsanfrage an das entsprechende Gerät starten, indem Sie eine der connectGatt()-Methoden aufrufen. Der Wert, den Sie an die boolesche Variable autoConnect übergeben, definiert, welcher der folgenden beiden Verbindungsmodi vom GATT-Client verwendet wird:

  • Direkte Verbindung (autoconnect = false): Es wird versucht, eine direkte Verbindung zum Peripheriegerät herzustellen. Wenn das Gerät nicht verfügbar ist, schlägt der Vorgang fehl. Bei einer Unterbrechung versucht der GATT-Client nicht automatisch, eine neue Verbindung herzustellen.
  • Automatisch verbinden (autoconnect = true): Es wird versucht, automatisch eine Verbindung zum Peripheriegerät herzustellen, wenn es verfügbar ist. Bei einer vom Peripheriegerät initiierten Verbindungsunterbrechung oder wenn sich das Peripheriegerät außerhalb der Reichweite befindet, versucht der GATT-Client automatisch, eine Verbindung wiederherzustellen, sobald das Peripheriegerät verfügbar ist.

Im Hintergrund

Es gibt keine Einschränkungen für die Verbindung zu einem Gerät, während die App im Hintergrund ausgeführt wird. Die Verbindung wird jedoch geschlossen, wenn der Prozess beendet wird. Außerdem gibt es Einschränkungen beim Starten von Aktivitäten (unter Android 10 und höher) oder Diensten im Vordergrund (unter Android 12 und höher) im Hintergrund.

Um eine Verbindung im Hintergrund herzustellen, können Apps daher die folgenden Lösungen verwenden:

Mit einem Gerät verbunden bleiben

Idealerweise sollten Apps Verbindungen zu Peripheriegeräten nur so lange aufrechterhalten, wie es erforderlich ist, und die Verbindung trennen, sobald die Aufgabe abgeschlossen ist. Es gibt jedoch zwei Fälle, in denen eine App eine Verbindung möglicherweise unbegrenzt aufrechterhalten muss:

In beiden Fällen sind die folgenden Optionen verfügbar:

Beim Wechseln zwischen Apps

Das Finden eines Geräts, die Verbindung damit und die Datenübertragung sind zeitaufwendig und ressourcenintensiv. Um zu vermeiden, dass die Verbindung getrennt wird und der gesamte Vorgang jedes Mal wiederholt werden muss, wenn der Nutzer zwischen Apps wechselt oder gleichzeitig mehrere Aufgaben ausführt, sollten Sie die Verbindung so lange aufrechterhalten, bis der Vorgang abgeschlossen ist. Sie können entweder einen Dienst im Vordergrund mit dem Typ connectedDevice oder die API zur Anwesenheit von Companion-Geräten verwenden.

Während Sie Benachrichtigungen von Peripheriegeräten hören

Damit die App Benachrichtigungen von Peripheriegeräten empfangen kann, muss sie setCharacteristicNotification() aufrufen, Callbacks mit onCharacteristicChanged() empfangen und die Verbindung aufrechterhalten. Bei den meisten Apps ist es am besten, diesen Anwendungsfall mit CompanionDeviceService zu unterstützen, da die App wahrscheinlich über einen längeren Zeitraum hinweg zuhören muss. Sie können jedoch auch einen Dienst im Vordergrund verwenden.

In beiden Fällen können Sie nach einem beendeten Prozess eine neue Verbindung herstellen. Folgen Sie dazu der Anleitung im Abschnitt Mit einem Gerät verbinden.