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:
BluetoothLeScanner
, wie unter BLE-Geräte finden beschrieben. (Beispiel)CompanionDeviceManager
, wie unter Companion-Geräte koppeln beschrieben. (Beispiel)
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 SiestartScan()
mit einemPendingIntent
-Objekt anstelle einesScanCallback
-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:
- Ein
BluetoothLeScanner
-Scanergebnis, wie im vorherigen Abschnitt beschrieben. - Die aus
BluetoothAdapter.getBondedDevices()
abgerufene Liste der verbundenen Geräte. - Den Cache
BluetoothAdapter
mitBluetoothAdapter.getRemoteLeDevice()
.
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:
- Stellen Sie mit WorkManager eine Verbindung zu Ihrem Gerät her.
- Du kannst einen
PeriodicWorkRequest
oder einenOneTimeWorkRequest
festlegen, um eine definierte Aktion auszuführen, auch wenn unter Umständen App-Einschränkungen gelten. - Darüber hinaus profitieren Sie von WorkManager-Funktionen wie Arbeitseinschränkungen, beschleunigten Arbeiten und Richtlinien für Wiederholungsversuche.
- Wenn die Verbindung so lange wie möglich aktiv bleiben muss, um eine Aufgabe wie Datensynchronisierung oder Datenabfragen von den Peripheriegeräten auszuführen, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für Worker mit langer Ausführungszeit. Allerdings gelten ab Android 12 Einschränkungen bei der Einführung von Diensten im Vordergrund.
- Du kannst einen
- Starten Sie einen Dienst im Vordergrund mit dem Typ
connectedDevice
.- Wenn die Verbindung so lange wie möglich aktiv bleiben muss, um eine Aufgabe wie Datensynchronisierung oder Datenabfragen von den Peripheriegeräten auszuführen, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für Worker mit langer Ausführungszeit. Allerdings gelten ab Android 12 Einschränkungen bei der Einführung von Diensten im Vordergrund.
- Rufen Sie
startScan()
mit einemPendingIntent
-Objekt auf, wie unter Gerät finden beschrieben, um den Prozess zu aktivieren, wenn das Gerät vorhanden ist. Das Peripheriegerät muss Werbung schalten.- Wir empfehlen, einen Worker und einen Job zu starten. Dieser Vorgang kann vom System unterbrochen werden und daher nur kurzzeitige Kommunikation unterstützt.
- In Versionen vor Android 12 können Sie einen Dienst im Vordergrund direkt über das
PendingIntent
-Objekt starten.
- Verwenden Sie
CompanionDeviceService
und eine der BerechtigungenREQUEST_COMPANION_RUN_IN_BACKGROUND
oderREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
, um den Dienst im Hintergrund zu starten.
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:
- Verwenden Sie
CompanionDeviceService
mit der BerechtigungREQUEST_COMPANION_RUN_IN_BACKGROUND
und der MethodeCompanionDeviceManager.startObservingDevicePresence()
. - Starten Sie einen Dienst im Vordergrund, während die Anwendung im Vordergrund ausgeführt wird (oder in einer der Ausnahmen) mit dem Vordergrundtyp
connectedDevice
.
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.