Komunikacja w tle

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:

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 obiektem PendingIntent zamiast obiektu ScanCallback, 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ł:

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ń:

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ść:

W obu przypadkach dostępne są te opcje:

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.