W tym przewodniku znajdziesz omówienie najważniejszych przypadków użycia związanych z komunikacją z urządzeniami peryferyjnymi, gdy aplikacja działa w tle:
Istnieje wiele opcji obsługi każdego z tych przypadków użycia. Każda z nich ma zalety i wady, które mogą sprawić, że będzie mniej lub bardziej odpowiednia do Twoich potrzeb.
Poniższy diagram przedstawia uproszczony widok wskazówek na tej stronie:

Znajdź urządzenie
Najpierw aplikacja musi znaleźć urządzenie, z którym ma się połączyć. Aby znaleźć urządzenie BLE, możesz użyć jednego z tych interfejsów API:
BluetoothLeScannerzgodnie z opisem w sekcji Znajdowanie urządzeń BLE. (przykład)CompanionDeviceManager, zgodnie z opisem w sekcji Parowanie urządzenia towarzyszącego. (przykład)
W tle
Nie ma żadnych ograniczeń dotyczących korzystania z tych interfejsów API, gdy aplikacja nie jest widoczna, ale oba wymagają, aby proces aplikacji był aktywny. Jeśli proces aplikacji nie jest uruchomiony, możesz skorzystać z tych obejść:
- W przypadku
BluetoothLeScanner: wywołajstartScan()z obiektemPendingIntentzamiast obiektuScanCallback, aby otrzymywać powiadomienia, gdy urządzenie pasujące do filtra zostanie zeskanowane. (przykład) - W przypadku
CompanionDeviceManager: postępuj zgodnie ze wskazówkami w sekcji Utrzymywanie aktywności aplikacji towarzyszących, aby wybudzić aplikację i utrzymać jej aktywność, gdy wcześniej powiązane urządzenie jest w zasięgu. (przykład)
Połącz się z urządzeniem
Aby połączyć się z urządzeniem po jego znalezieniu, musisz uzyskać instancję BluetoothDevice dla urządzenia z jednego z tych źródeł:
BluetoothLeScannerwynik skanowania, jak opisano w poprzedniej sekcji.- Lista powiązanych urządzeń pobrana z
BluetoothAdapter.getBondedDevices(). BluetoothAdapter, używającBluetoothAdapter.getRemoteLeDevice().
Gdy masz instancję BluetoothDevice, możesz rozpocząć żądanie połączenia z odpowiednim urządzeniem, wywołując jedną z metod connectGatt(). Wartość logiczna przekazywana do autoConnect określa, którego z tych 2 trybów połączenia używa klient GATT:
- Połączenie bezpośrednie (
autoconnect = false): próba połączenia bezpośrednio z urządzeniem peryferyjnym, która kończy się niepowodzeniem, jeśli urządzenie jest niedostępne. W przypadku rozłączenia klient GATT nie próbuje automatycznie połączyć się ponownie. - Połącz automatycznie (
autoconnect = true): próba automatycznego połączenia z urządzeniem peryferyjnym, gdy jest ono dostępne. W przypadku rozłączenia zainicjowanego przez urządzenie peryferyjne lub spowodowanego tym, że urządzenie peryferyjne jest poza zasięgiem, klient GATT automatycznie próbuje ponownie nawiązać połączenie, gdy urządzenie peryferyjne jest dostępne.
W tle
Nie ma ograniczeń dotyczących łączenia się z urządzeniem, gdy aplikacja działa w tle, ale połączenie zostanie zamknięte, jeśli proces zostanie przerwany. Dodatkowo obowiązują ograniczenia dotyczące rozpoczynania działań (w Androidzie 10 i nowszych) lub usług na pierwszym planie (w Androidzie 12 i nowszych) w tle.
Aby nawiązać połączenie w tle, aplikacje mogą korzystać z tych rozwiązań:
- Użyj WorkManagera, aby połączyć się z urządzeniem.
- Możesz ustawić
PeriodicWorkRequestlubOneTimeWorkRequest, aby wykonywać określone działanie, ale mogą obowiązywać ograniczenia aplikacji. - Możesz też korzystać z funkcji WorkManagera, takich jak ograniczenia pracy, prace priorytetowe, zasady ponawiania i inne.
- Jeśli połączenie musi być utrzymywane jak najdłużej, aby wykonać zadanie, takie jak synchronizacja danych lub odpytywanie urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie ze wskazówkami podanymi w artykule Obsługa długotrwałych procesów roboczych. Jednak od Androida 12 obowiązują ograniczenia dotyczące uruchamiania usług na pierwszym planie.
- Możesz ustawić
- Uruchom usługę działającą na pierwszym planie typu
connectedDevice.- Jeśli połączenie musi być utrzymywane jak najdłużej, aby wykonać zadanie, takie jak synchronizacja danych lub odpytywanie urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie ze wskazówkami podanymi w artykule Obsługa długotrwałych procesów roboczych. Jednak od Androida 12 obowiązują ograniczenia dotyczące uruchamiania usług na pierwszym planie.
- Wywołaj
startScan()z obiektemPendingIntent, jak opisano w sekcji Znajdowanie urządzenia, aby wybudzić proces, gdy urządzenie jest obecne. Urządzenie peryferyjne musi być rozgłaszane.- Zalecamy uruchomienie instancji roboczej i zadania. Może to zostać przerwane przez system, więc obsługuje tylko krótką komunikację.
- W wersjach starszych niż Android 12 możesz uruchomić usługę na pierwszym planie bezpośrednio z obiektu
PendingIntent.
- Aby uruchomić usługę w tle, użyj uprawnienia
CompanionDeviceServicei jednego z uprawnieńREQUEST_COMPANION_RUN_IN_BACKGROUNDlubREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.
Utrzymywanie połączenia z urządzeniem
Najlepiej, aby aplikacje utrzymywały połączenia z urządzeniami peryferyjnymi tylko tak długo, jak jest to konieczne, i rozłączały się po zakończeniu zadania. Istnieją jednak 2 przypadki, w których aplikacja może potrzebować stałego połączenia:
- Podczas przełączania się między aplikacjami.
- Podczas słuchania powiadomień o urządzeniach peryferyjnych
W obu przypadkach dostępne są te opcje:
- Użyj
CompanionDeviceServicez uprawnieniemREQUEST_COMPANION_RUN_IN_BACKGROUNDi metodąCompanionDeviceManager.startObservingDevicePresence(). - Uruchom usługę działającą na pierwszym planie, gdy aplikacja działa na pierwszym planie (lub w ramach jednego z wyjątków) z typem usługi działającej na pierwszym planie
connectedDevice.
podczas przełączania się między aplikacjami,
Znalezienie urządzenia, połączenie się z nim i przesłanie danych jest czasochłonne i wymaga wielu zasobów. Aby uniknąć utraty połączenia i konieczności powtarzania całego procesu za każdym razem, gdy użytkownik przełącza się między aplikacjami lub wykonuje kilka zadań jednocześnie, należy utrzymywać połączenie do momentu zakończenia operacji. Możesz użyć usługi działającej na pierwszym planie typu connectedDevice lub interfejsu API obecności urządzenia towarzyszącego.
Podczas odsłuchiwania powiadomień z urządzeń peryferyjnych
Aby nasłuchiwać powiadomień z urządzeń peryferyjnych, aplikacja musi wywołać metodę setCharacteristicNotification(), nasłuchiwać wywołań zwrotnych za pomocą metody onCharacteristicChanged() i utrzymywać połączenie. W większości aplikacji najlepiej jest obsługiwać ten przypadek użycia za pomocą CompanionDeviceService, ponieważ aplikacja prawdopodobnie będzie musiała nasłuchiwać przez dłuższy czas. Możesz też jednak użyć usługi działającej na pierwszym planie.
W obu przypadkach możesz ponownie połączyć się po zakończeniu procesu, postępując zgodnie z instrukcjami w sekcji Łączenie z urządzeniem.