Pracuję nad aplikacją dla Androida, która działa w tle i umożliwia obsługę akcesoriów Bluetooth. Chciałbym ciągle słuchać w tle urządzenia Bluetooth, aby spróbować otworzyć gniazdo na telefon. Moje pytanie brzmi: czy można to osiągnąć bez ciągłego utrzymywania częściowego wakeloku, ponieważ to oczywiście miałoby poważne konsekwencje dla baterii. Więc zastanawiam się, jaki wpływ ma Bluetooth na telefon zasypiający. Czy telefon nie budzi się, gdy jest otwarte gniazdo Bluetooth? Czy układ Bluetooth automatycznie uruchamia system Android, jeśli urządzenie próbuje się połączyć? Próbowałem wykonać kilka testów, aby odpowiedzieć na te pytania, ale trudno jest określić, co dzieje się z blokadą wybudzania; ponadto nie wiem, czy mogę polegać na zachowaniu, które obserwuję, lub czy może ono ulec zmianie na innych urządzeniach.Android Bluetooth i WakeLock relacja
Odpowiedz
Telefon nie budzi się, gdy jest otwarte gniazdo Bluetooth, a także nie jest tak, że układ Bluetooth obudzi Androida, jeśli urządzenie spróbuje się połączyć. Zwykle istnieje wątek działający w tle, który akceptuje połączenia na otwartym porcie i gdy tylko urządzenie próbuje się połączyć, to właśnie ten wątek odczytuje połączenie, uzyskuje uwierzytelnienie z urządzenia przychodzącego (zakładam, że istnieje protokół bezpieczeństwa akceptujący nowe połączenia przychodzące) i po potwierdzeniu połączenia przychodzącego tworzony/powiadamiany jest niezależny wątek do obsługi późniejszej wymiany informacji z tym wątkiem.
W związku z tym proces tła zużyje trochę energii i rozładuje baterię, a także jest odpowiedzialny za częściowe czuwanie Androida (częściowo jako proces w tle i zawsze można kontrolować, jak często sprawdza połączenia przychodzące). Zwykle ten proces w tle nie jest uruchamiany zawsze, działa tylko wtedy, gdy Bluetooth jest włączony w systemie Android. Możesz więc utworzyć wątek, który powinien działać tylko wtedy, gdy Bluetooth jest włączony w systemie Android, w przeciwnym razie powinien się uśpić.
Właśnie to przetestowałem i wydaje się, że na Galaxy Nexusie (jako "serwerze") przychodzące połączenie Bluetooth obudzi urządzenie. (To samo dotyczy wysyłania ping ICMP do adresu IP Wi-Fi). –
Na Nexusie 4 też tak wygląda, ale nie mogę być w 100% pewny, ponieważ urządzenie uwielbia się budzić bez wyraźnego powodu. Przynajmniej zawsze budzi się w razie potrzeby. Z urządzeniem Android 2.3.3 (Galaxy Ace) wyzwala ono widoczne żądanie parowania po obu stronach, co czyni go bezużytecznym (a zatem bezsensownym do testowania przebudzenia). –
Tak, jeśli aplikacja działa, a wątek jest w metodzie serverSocket.accept(), przychodzące połączenie telefon się budzi, więc nie ma potrzeby korzystania z wakelocks. Upewnij się jednak, że twoja usługa jest na pierwszym planie i nie jest zabijana przez system.
To samo dotyczy BLE. jeśli wywołasz metodę connectGatt() z autoconnect = true, gdy urządzenie peryferyjne zaakceptuje połączenie, telefon się obudzi. Nie jest wymagane wakelock. Nie zadałem sobie trudu, aby sprawdzić, czy to zachowanie uniemożliwia procesorowi głębokie zasypianie. –
Dla jasności, usługa działająca w tle również działa dobrze, zwłaszcza jeśli jest STICKY. Urządzenie nadal się obudzi. Powodem używania nowej wiedzy byłoby zapewnienie jak największej szansy na to, że nie zostaną zabici z powodu niskich zasobów –
Jeśli projektujesz dla urządzeń docelowych na bazie pianki lub wyższej, istnieje tryb DOZE w celu leczenia takich stanów. Wtedy nie musisz się martwić o te rzeczy. Może obsługiwać WAKE_LOCK z odpowiednim mechanizmem.
Czy w międzyczasie udało ci się znaleźć odpowiedź lub dodatkowe informacje? Jeśli tak, opublikuj je, ponieważ obecnie mam dokładnie ten sam problem. –
the bt connect powinien zużywać więcej baterii niż urządzenie nie śpiące, więc przytrzymaj wakelock, ponieważ WYLUŻYsz baterię (jednak nie tak źle jak wifi) – NikkyD
czy to jest BLE 4.x, czy zwykły bluetooth? – zrgiu