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:
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 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: RufestartScan()mit einemPendingIntent-Objekt anstelle einesScanCallback-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:
- 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().
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:
- Verwenden Sie WorkManager, um eine Verbindung zu Ihrem Gerät herzustellen.
- Sie können einen
PeriodicWorkRequestoder einenOneTimeWorkRequestfestlegen, um eine definierte Aktion auszuführen. Es können jedoch App-Einschränkungen gelten. - Außerdem können Sie von WorkManager-Funktionen wie Arbeitseinschränkungen, Express-Jobs und Wiederholungsrichtlinien profitieren.
- Wenn die Verbindung so lange wie möglich aufrechterhalten werden muss, um eine Aufgabe auszuführen, z. B. die Datensynchronisierung oder das Abrufen von Daten von Peripheriegeräten, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für lang laufende Worker. Ab Android 12 gelten jedoch Launch-Beschränkungen für Dienste im Vordergrund.
- Sie können einen
- Starten Sie einen Dienst im Vordergrund mit dem Typ
connectedDevice.- Wenn die Verbindung so lange wie möglich aufrechterhalten werden muss, um eine Aufgabe auszuführen, z. B. die Datensynchronisierung oder das Abrufen von Daten von Peripheriegeräten, müssen Sie einen Dienst im Vordergrund starten. Folgen Sie dazu der Anleitung unter Unterstützung für lang laufende Worker. Ab Android 12 gelten jedoch Launch-Beschränkungen für Dienste im Vordergrund.
- Rufe
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 Advertising-Pakete senden.- Wir empfehlen, einen Worker und einen Job zu starten. Dies kann vom System unterbrochen werden und unterstützt daher nur eine kurze Kommunikation.
- In Versionen vor Android 12 können Sie einen Dienst im Vordergrund direkt über das
PendingIntent-Objekt starten.
- Verwenden Sie
CompanionDeviceServiceund entweder die BerechtigungREQUEST_COMPANION_RUN_IN_BACKGROUNDoderREQUEST_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
CompanionDeviceServicemit der BerechtigungREQUEST_COMPANION_RUN_IN_BACKGROUNDund der MethodeCompanionDeviceManager.startObservingDevicePresence(). - Starten Sie einen Dienst im Vordergrund, während sich die App im Vordergrund befindet (oder eine der Ausnahmen gilt), mit dem Vordergrundtyp
connectedDevice.
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.