Ten przewodnik zawiera omówienie obsługi najważniejszych przypadków użycia komunikacji z urządzeniami peryferyjnymi, gdy aplikacja działa w tle:
Dostępne są różne opcje obsługi każdego z tych przypadków użycia. Każda z nich ma swoje zalety i wady, co może sprawiać, że będzie 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 ma się połączyć. Aby znaleźć urządzenie BLE, możesz użyć jednego z tych interfejsów API:
BluetoothLeScanner
zgodnie 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
Korzystanie z tych interfejsów API jest nieograniczone, gdy aplikacja nie jest widoczna, ale oba wymagają do działania procesu aplikacji. Jeśli proces aplikacji nie jest uruchomiony, możesz zastosować te rozwiązania:
- W przypadku
BluetoothLeScanner
: wywołaj metodęstartScan()
z obiektemPendingIntent
zamiast obiektuScanCallback
, aby otrzymać powiadomienie, gdy urządzenie pasujące do filtra zostanie przeskanowane. (Przykład) - W przypadku aplikacji
CompanionDeviceManager
: postępuj zgodnie ze wskazówkami w artykule Nie wybudzaj aplikacji towarzyszących, aby wybudzić aplikację i nie wyłączać jej do czasu, gdy powiązane wcześniej urządzenie będzie w zasięgu. (Przykład)
Połącz się z urządzeniem
Aby połączyć się ze znalezionym urządzeniem, musisz uzyskać jego wystąpienie BluetoothDevice
z jednego z tych źródeł:
- wynik skanowania
BluetoothLeScanner
zgodnie z opisem w poprzedniej sekcji, - Lista powiązanych urządzeń została pobrana z
BluetoothAdapter.getBondedDevices()
. - Pamięć podręczna
BluetoothAdapter
z użyciemBluetoothAdapter.getRemoteLeDevice()
.
Po utworzeniu instancji BluetoothDevice
możesz wysłać prośbę o połączenie z odpowiednim urządzeniem, wywołując jedną z metod connectGatt()
. Wartość przekazywana do wartości logicznej autoConnect
określa, którego z tych 2 trybów połączenia używa klient GATT:
- Połączenie bezpośrednie (
autoconnect = false
): spróbuj połączyć się bezpośrednio z urządzeniem peryferyjnym – nie uda się, jeśli urządzenie jest niedostępne. W przypadku rozłączenia klient GATT nie próbuje automatycznie ponownie nawiązać połączenia. - Połączenie automatyczne (
autoconnect = true
): spróbuj automatycznie łączyć się z urządzeniem peryferyjnym, gdy jest 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 ponownie nawiązać połączenie, gdy urządzenie peryferyjne będzie dostępne.
W tle
Nie ma ograniczeń w łączeniu się z urządzeniem, gdy aplikacja działa w tle. Jeśli jednak proces zostanie przerwany, połączenie zostanie zamknięte. Oprócz tego obowiązują ograniczenia dotyczące rozpoczynania działań (w Androidzie 10 i nowszych) oraz usług na pierwszym planie (w Androidzie 12 i nowszych) działających 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
tak, aby wykonywać określone działanie, chociaż mogą obowiązywać ograniczenia dotyczące aplikacji. - Możesz też korzystać z funkcji WorkManager, takich jak ograniczenia w pracy, szybsza praca, zasady ponawiania próby i inne.
- Jeśli połączenie musi być utrzymywane tak długo, jak to możliwe, do wykonywania zadania, takiego jak synchronizowanie danych lub odpytywanie z urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie ze wskazówkami w artykule Obsługa długotrwałych instancji roboczych. Jednak od Androida 12 obowiązują ograniczenia dotyczące uruchamiania usług na pierwszym planie.
- Możesz ustawić
- Uruchomić usługę na pierwszym planie typu
connectedDevice
.- Jeśli połączenie musi być utrzymywane tak długo, jak to możliwe, do wykonywania zadania, takiego jak synchronizowanie danych lub odpytywanie z urządzeń peryferyjnych, musisz uruchomić usługę na pierwszym planie zgodnie ze wskazówkami w artykule Obsługa długotrwałych instancji roboczych. Jednak od Androida 12 obowiązują ograniczenia dotyczące uruchamiania usług na pierwszym planie.
- Wywołaj funkcję
startScan()
z obiektemPendingIntent
zgodnie z opisem w sekcji Znajdowanie urządzenia, aby wybudzić proces, gdy jest ono pod ręką. Urządzenie peryferyjne musi obsługiwać reklamy.- Zalecamy uruchomienie instancji roboczej i zadania. System może przerywać tę czynność, więc obsługuje tylko komunikację krótkotrwałą.
- W wersjach starszych niż 12 możesz uruchomić usługę na pierwszym planie bezpośrednio z obiektu
PendingIntent
.
- Aby uruchomić usługę w tle, użyj
CompanionDeviceService
i jednego z uprawnieńREQUEST_COMPANION_RUN_IN_BACKGROUND
lubREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.
Utrzymuj połączenie z urządzeniem
W idealnej sytuacji aplikacje powinny utrzymywać połączenia z urządzeniami peryferyjnymi tylko tak długo, jak jest to konieczne, i rozłączać się po zakończeniu zadania. Istnieją jednak 2 przypadki, w których aplikacja może chcieć utrzymywać połączenie w nieskończoność:
- 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
CompanionDeviceService
z uprawnieniemREQUEST_COMPANION_RUN_IN_BACKGROUND
i metodąCompanionDeviceManager.startObservingDevicePresence()
. - Uruchom usługę na pierwszym planie, gdy aplikacja działa na pierwszym planie (lub w ramach jednego z wykluczeń) z typem
connectedDevice
na pierwszym planie.
Podczas przełączania się między aplikacjami
Znajdowanie urządzenia, łączenie się z nim i przesyłanie danych jest czasochłonne i pochłania duże zasoby. Aby uniknąć utraty połączenia i wykonywania całego procesu za każdym razem, gdy użytkownik przełącza się między aplikacjami lub wykonuje równocześnie zadania, dopilnuj, aby połączenie było aktywne do czasu zakończenia operacji. Możesz używać 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 odsłuchiwać powiadomienia z urządzeń peryferyjnych, aplikacja musi wywołać metodę setCharacteristicNotification()
, odsłuchiwać wywołania zwrotne za pomocą metody onCharacteristicChanged()
i utrzymywać połączenie. W przypadku większości aplikacji najlepiej jest obsługiwać ten przypadek użycia za pomocą właściwości CompanionDeviceService
, ponieważ aplikacja prawdopodobnie będzie musiała słuchać przez długi czas. Możesz też jednak korzystać z usługi na pierwszym planie.
W każdym przypadku możesz ponownie nawiązać połączenie po zakończeniu procesu, postępując zgodnie z instrukcjami w sekcji Łączenie z urządzeniem.