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:
BluetoothLeScanner
wie unter BLE-Geräte finden beschrieben. (Beispiel)CompanionDeviceManager
, wie unter Companion-Gerät koppeln beschrieben. (Beispiel)
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 SiestartScan()
mit einemPendingIntent
-Objekt anstelle einesScanCallback
-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:
- Ein
BluetoothLeScanner
-Scanergebnis, wie im vorherigen Abschnitt beschrieben. - Die Liste der gekoppelten Geräte, die von
BluetoothAdapter.getBondedDevices()
abgerufen wurde. - Der
BluetoothAdapter
-Cache mitBluetoothAdapter.getRemoteLeDevice()
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:
- Verwenden Sie WorkManager, um eine Verbindung zu Ihrem Gerät herzustellen.
- Sie können eine
PeriodicWorkRequest
oder eineOneTimeWorkRequest
festlegen, um eine bestimmte Aktion auszuführen. Es können jedoch App-Einschränkungen gelten. - Außerdem können Sie von WorkManager-Funktionen wie Arbeitseinschränkungen, Beschleunigte Arbeit und Wiederholrichtlinie profitieren.
- Wenn die Verbindung so lange wie möglich aufrechterhalten werden muss, um eine Aufgabe auszuführen, z. B. die Datensynchronisierung oder die Abfrage von Peripheriegeräten, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für langlaufende Worker. Ab Android 12 gelten jedoch Einschränkungen für den Start von Diensten im Vordergrund.
- Sie können eine
- Starten Sie einen Dienst im Vordergrund vom Typ
connectedDevice
.- Wenn die Verbindung so lange wie möglich aufrechterhalten werden muss, um eine Aufgabe auszuführen, z. B. die Datensynchronisierung oder die Abfrage von Peripheriegeräten, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für langlaufende Worker. Ab Android 12 gelten jedoch Einschränkungen für den Start von Diensten im Vordergrund.
- Rufen Sie
startScan()
mit einemPendingIntent
-Objekt auf, wie unter Gerät finden beschrieben, um Ihren Prozess zu aktivieren, wenn sich das Gerät in der Nähe befindet. Das Peripheriegerät muss Werbung senden.- Wir empfehlen, einen Worker und einen Job zu starten. Dies kann vom System unterbrochen werden und daher kann nur eine Kommunikation mit kurzer Dauer unterstützt werden.
- In Versionen niedriger als 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 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:
- Verwenden Sie
CompanionDeviceService
mit der BerechtigungREQUEST_COMPANION_RUN_IN_BACKGROUND
und der MethodeCompanionDeviceManager.startObservingDevicePresence()
. - Starten Sie einen Dienst im Vordergrund, während die App im Vordergrund (oder in einer der Ausnahmen) ausgeführt wird, mit dem Typ
connectedDevice
für Dienste im Vordergrund.
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.