Im Hintergrund kommunizieren

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

Es gibt mehrere Optionen, um jeden dieser Anwendungsfälle zu unterstützen. Jedes davon hat Vor- und Nachteile, die es für Ihre spezifischen Anforderungen möglicherweise mehr oder weniger geeignet machen können.

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

Gerät finden

Zuerst muss deine App ein Gerät finden, zu dem sie eine Verbindung herstellen kann. Um ein BLE-Gerät zu finden, können Sie eine der folgenden APIs verwenden:

Im Hintergrund

Es gibt keine Einschränkungen bei der Verwendung einer dieser APIs, solange die Anwendung nicht sichtbar ist. Für beide muss der Anwendungsprozess jedoch aktiv sein. Wenn der Anwendungsprozess nicht ausgeführt wird, können Sie das Problem folgendermaßen umgehen:

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

Mit einem Gerät verbinden

Damit Sie eine Verbindung zu einem Gerät herstellen können, müssen Sie für das Gerät eine BluetoothDevice-Instanz aus einer der folgenden Quellen abrufen:

Sobald Sie eine BluetoothDevice-Instanz haben, können Sie eine Verbindungsanfrage an das entsprechende Gerät durch Aufrufen einer der connectGatt()-Methoden starten. Der Wert, den Sie an den booleschen Wert autoConnect übergeben, definiert, welchen der folgenden beiden Verbindungsmodi der GATT-Client verwendet:

  • Direct Connect (autoconnect = false): Versuchen Sie, eine direkte Verbindung zum Peripheriegerät herzustellen, und schlagen Sie fehl, wenn das Gerät nicht verfügbar ist. Im Falle einer Verbindungsunterbrechung versucht der GATT-Client nicht automatisch, die Verbindung wiederherzustellen.
  • Automatische Verbindung (autoconnect = true): Es wird versucht, automatisch eine Verbindung zum Peripheriegerät herzustellen, wenn es verfügbar ist. Wenn die Verbindung vom Peripheriegerät ausgelöst wurde oder sich das Peripheriegerät außerhalb der Reichweite befindet, versucht der GATT-Client automatisch, die Verbindung wiederherzustellen, sobald das Peripheriegerät verfügbar ist.

Im Hintergrund

Es gibt keine Einschränkungen für die Verbindung mit einem Gerät, während die App im Hintergrund ausgeführt wird. Die Verbindung wird jedoch getrennt, wenn der Prozess abgebrochen wird. Darüber hinaus gibt es Einschränkungen für Startaktivitäten (unter Android 10 und höher) oder Dienste im Vordergrund (unter Android 12 und höher) aus dem Hintergrund.

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

Mit einem Gerät verbunden bleiben

Idealerweise sollten Apps Verbindungen zu Peripheriegeräten nur so lange wie nötig aufrechterhalten und nach Abschluss der Aufgabe getrennt werden. Es gibt jedoch zwei Fälle, in denen eine Anwendung möglicherweise eine Verbindung auf unbestimmte Zeit aufrechterhalten muss:

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

Beim Wechseln zwischen Apps

Ein Gerät zu finden, eine Verbindung zu ihm herzustellen und Daten zu übertragen, ist zeitaufwendig und ressourcenintensiv. Um zu vermeiden, dass die Verbindung unterbrochen wird und der Nutzer jedes Mal den vollständigen Prozess ausführen muss, wenn der Nutzer zwischen Anwendungen wechselt oder gleichzeitig Aufgaben ausführt, sollten Sie die Verbindung aktiv lassen, bis der Vorgang abgeschlossen ist. Sie können entweder einen Dienst im Vordergrund mit dem Typ connectedDevice oder die Companion Device Presence API verwenden.

Beim Abhören von Benachrichtigungen zu Peripheriegeräten

Zum Empfang von Benachrichtigungen von Peripheriegeräten muss die App setCharacteristicNotification() aufrufen, mit onCharacteristicChanged() auf Callbacks warten und die Verbindung aktiv halten. Für die meisten Anwendungen empfiehlt es sich, diesen Anwendungsfall mit CompanionDeviceService zu unterstützen, da die Anwendung wahrscheinlich lange Zeit weiter überwachen 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 Verbindung zu einem Gerät herstellen.