W tym przewodniku znajdziesz omówienie sposobów obsługi kluczowych zastosowań komunikacji z urządzeniami peryferyjnymi, gdy aplikacja działa w tle:
Każdy z tych przypadków użycia obsługuje się na kilka sposobów. Każda z nich ma swoje zalety i wady, które mogą sprawiać, że będzie ona bardziej lub mniej 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 się połączy. Aby znaleźć urządzenie BLE, możesz użyć jednego z tych interfejsów API:
BluetoothLeScanner
jak opisano w sekcji Znajdź urządzenia 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 żadnego z tych interfejsów API, gdy aplikacja jest niewidoczna, ale oba wymagają, aby proces aplikacji był aktywny. Jeśli proces aplikacji nie działa, możesz użyć tych obejść:
- W przypadku
BluetoothLeScanner
: wywołaj funkcjęstartScan()
z obiektemPendingIntent
zamiast obiektuScanCallback
, aby otrzymywać powiadomienia, gdy skanowane jest urządzenie pasujące do Twojego filtra. (Przykład) - W przypadku
CompanionDeviceManager
: postępuj zgodnie z instrukcjami w sekcji Utrzymywanie aplikacji towarzyszących w stanie czuwania, aby aktywować aplikację i utrzymać ją w stanie czuwania, gdy powiązane wcześniej urządzenie znajduje się w zasięgu. (Przykład)
Połącz się z urządzeniem
Aby połączyć się z urządzeniem po jego znalezieniu, musisz pobrać instancję BluetoothDevice
z jednego z tych źródeł:
- Wynik skanowania
BluetoothLeScanner
, jak opisano w poprzedniej sekcji. - Lista urządzeń powiązanych pobrana z
BluetoothAdapter.getBondedDevices()
. - Pamięć podręczna
BluetoothAdapter
, korzystając zBluetoothAdapter.getRemoteLeDevice()
.
Gdy masz instancję BluetoothDevice
, możesz rozpocząć żądanie połączenia z odpowiednim urządzeniem, wywołując jedną z metod connectGatt()
. Wartość przekazana do atrybutu logicznego 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 z urządzeniem peryferyjnym bezpośrednio, która kończy się niepowodzeniem, jeśli urządzenie jest niedostępne. W przypadku rozłączenia klient GATT nie próbuje automatycznie nawiązać ponownego połączenia. - Łączenie automatyczne (
autoconnect = true
): automatyczne łączenie się z urządzeniem peryferyjnym, gdy jest ono dostępne. W przypadku rozłączenia zainicjowanego przez urządzenie peryferyjne lub gdy urządzenie peryferyjne znajduje się poza zasięgiem, klient GATT automatycznie próbuje nawiązać połączenie, gdy urządzenie peryferyjne będzie dostępne.
W tle
Nie ma żadnych ograniczeń dotyczących łączenia się z urządzeniem, gdy aplikacja działa w tle, ale połączenie zostanie zamknięte, jeśli proces zostanie zatrzymany. Dodatkowo istnieją ograniczenia dotyczące uruchamiania działań (w Androidzie 10 i nowszych wersjach) lub usług na pierwszym planie (w Androidzie 12 i nowszych wersjach) 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ć
PeriodicWorkRequest
lubOneTimeWorkRequest
, aby wykonać zdefiniowane działanie, chociaż mogą mieć zastosowanie ograniczenia dotyczące aplikacji. - Dodatkowo możesz korzystać z funkcji WorkManager, takich jak ograniczenia pracy, przyspieszona praca czy polityka ponownych prób.
- Jeśli połączenie musi być utrzymywane tak długo, jak to możliwe, aby wykonać zadanie, takie jak synchronizacja danych lub sondowanie z urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie z instrukcjami podanymi w artykule Wsparcie dotyczące długo działających procesów roboczych. Jednak ograniczenia dotyczące uruchamiania usług na pierwszym planie obowiązują od Androida 12.
- Możesz ustawić
- Uruchom usługę na pierwszym planie typu
connectedDevice
.- Jeśli połączenie musi być utrzymywane tak długo, jak to możliwe, aby wykonać zadanie, takie jak synchronizacja danych lub sondowanie z urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie z instrukcjami podanymi w artykule Wsparcie dotyczące długo działających procesów roboczych. Jednak ograniczenia dotyczące uruchamiania usług na pierwszym planie obowiązują od Androida 12.
- Aby aktywować proces, gdy urządzenie jest obecne, wywołaj funkcję
startScan()
z obiektemPendingIntent
zgodnie z opisem w artykule Znajdź urządzenie. Urządzenie peryferyjne musi wyświetlać reklamy.- Zalecamy uruchomienie instancji roboczej i zadania. Może to zostać przerwane przez system, dlatego można używać go tylko do krótkich komunikatów.
- W wersjach starszych niż Android 12 usługę na pierwszym planie możesz uruchomić bezpośrednio z obiektu
PendingIntent
.
- Użyj uprawnień
CompanionDeviceService
i jednego z tych uprawnień:REQUEST_COMPANION_RUN_IN_BACKGROUND
lubREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
, aby uruchomić usługę w tle.
Nie rozłączaj się z urządzeniem
W idealnej sytuacji aplikacje powinny utrzymywać połączenia z urządzeniami peryferyjnymi tylko przez czas niezbędny do wykonania zadania i odłączać je po jego zakończeniu. Są jednak 2 przypadki, w których aplikacja może potrzebować stałego połączenia:
- Podczas przełączania się między aplikacjami.
- Podczas odsłuchiwania powiadomień o urządzeniach peryferyjnych.
W obu przypadkach dostępne są te opcje:
- Użyj metody
CompanionDeviceService
z uprawnieniemREQUEST_COMPANION_RUN_IN_BACKGROUND
i metodąCompanionDeviceManager.startObservingDevicePresence()
. - Uruchom usługę na pierwszym planie, gdy aplikacja jest na pierwszym planie (lub w ramach jednej z wyjątków) z
connectedDevice
typem pierwszego planu.
Podczas przełączania się między aplikacjami
Wyszukiwanie urządzenia, nawiązywanie z nim połączenia i przenoszenie danych zajmuje dużo czasu i zasobów. Aby uniknąć utraty połączenia i konieczności wykonania całego procesu za każdym razem, gdy użytkownik przełącza się między aplikacjami lub wykonuje zadania jednocześnie, należy utrzymać połączenie do czasu zakończenia operacji. Możesz użyć usługi na pierwszym planie typu connectedDevice
lub interfejsu API obecności urządzenia towarzyszącego.
Podczas słuchania powiadomień z urządzeń peryferyjnych
Aby słuchać powiadomień peryferyjnych, aplikacja musi wywołać funkcję setCharacteristicNotification()
, słuchać wywołań zwrotnych za pomocą funkcji onCharacteristicChanged()
i utrzymywać połączenie. W przypadku większości aplikacji najlepiej jest obsługiwać ten przypadek użycia za pomocą CompanionDeviceService
, ponieważ aplikacja prawdopodobnie będzie musiała przez długi czas nasłuchiwać. Możesz jednak użyć usługi na pierwszym planie.
W obu przypadkach po zakończeniu procesu możesz ponownie połączyć konto, wykonując instrukcje podane w sekcji Łączenie z urządzeniem.