Im Hintergrund kommunizieren

In diesem Leitfaden finden Sie eine Übersicht darüber, wie Sie wichtige Anwendungsfälle für die Kommunikation mit Peripheriegeräten unterstützen können, wenn Ihre App im Hintergrund ausgeführt wird:

Es gibt mehrere Optionen, um jeden dieser Anwendungsfälle zu unterstützen. 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 die App ein Gerät finden, mit dem sie sich verbinden kann. Zum Suchen eines BLE-Geräts können Sie eine der folgenden APIs verwenden:

Im Hintergrund

Es gibt keine Einschränkungen für die Verwendung dieser APIs, wenn die App nicht sichtbar ist. Allerdings muss der App-Prozess aktiv sein. Wenn der Anwendungsprozess nicht ausgeführt wird, können Sie die folgenden Problemumgehungen verwenden:

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

Mit einem Gerät verbinden

Wenn du eine Verbindung zu einem Gerät herstellen möchtest, nachdem du es gefunden hast, musst du eine BluetoothDevice-Instanz für das Gerät aus einer der folgenden Quellen abrufen:

Sobald 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 den booleschen Wert autoConnect übergeben, definiert, welchen der folgenden beiden Verbindungsmodi der GATT-Client verwendet:

  • Direkte Verbindung (autoconnect = false): Es wird versucht, eine direkte Verbindung zum Peripheriegerät herzustellen. Wenn das Gerät nicht verfügbar ist, schlägt die Verbindung fehl. Wenn die Verbindung getrennt wird, versucht der GATT-Client nicht automatisch, die Verbindung wiederherzustellen.
  • Automatisch verbinden (autoconnect = true): Versuchen Sie, automatisch eine Verbindung zum Peripheriegerät herzustellen, wenn es verfügbar ist. Wenn die Verbindung vom Peripheriegerät getrennt wird oder das Peripheriegerät nicht mehr in Reichweite ist, versucht der GATT-Client automatisch, die Verbindung wiederherzustellen, sobald das Peripheriegerät verfügbar ist.

Im Hintergrund

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

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

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 Suchen eines Geräts, das Herstellen einer Verbindung und das Übertragen von Daten sind zeitaufwendig und ressourcenintensiv. Damit die Verbindung nicht unterbrochen wird und der gesamte Vorgang nicht jedes Mal neu ausgeführt werden muss, wenn der Nutzer zwischen Apps wechselt oder mehrere Aufgaben gleichzeitig ausführt, sollte die Verbindung bis zum Abschluss des Vorgangs aufrechterhalten werden. Sie können entweder einen Dienst im Vordergrund mit dem Typ connectedDevice oder die Companion-Gerät-Präsenz-API verwenden.

Beim Anhören von Benachrichtigungen zu Peripheriegeräten

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

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