13

Mam działalność z niektórymi Handlers, które są wykonywane w odstępach nie dłuższych niż 5 minut. Aktywność jest uruchamiana z poziomu BroadcastReceiver i może zostać uruchomiona z wyłączonym ekranem, czekając, aż użytkownik złapie telefon i pobierze dane od użytkownika. W takim przypadku wywoływana jest aktywność onPause(), więc na pewno procesor jest w trybie uśpienia. Nie ustawiłem aktywności, aby włączyć ekran, ponieważ chcę oszczędzić jak najwięcej baterii.Czy handler post Posta nie zostanie zwolniony, gdy CPU sypi?

Testowałem to z moim telefonem i działa bardzo dobrze, a ekran jest wyłączony Handlers wykonać cały kod, który musi uruchomić. Jeśli włączam i wyłączam ekran, gdy czynność jest otwarta, wszystko działa poprawnie.

Teraz, wszędzie czytałem, że niektóre urządzenia nie działają zgodnie z oczekiwaniami, gdy ekran gaśnie, a procesor zasypia, przeważnie z akcelerometrami. Teraz moje pytanie brzmi: czy muszę zdobyć WakeLock, aby procesor nie spał podczas mojej aktywności? Naprawdę chcę to wiedzieć, ponieważ, jak już wspomniałem, nie chcę "marnować" baterii przez zakup drogiego WakeLock.

Wolałbym szczegółową odpowiedź osoby, która naprawdę wie, jak to działa.

+0

A dlaczego używasz działań do wykonywania zadań w tle? Aktywność służy do wyświetlania rzeczy, a nie wykonywania zadań. Czy sprawdziłeś usługi? – tolgap

+0

Nie, nie, działanie nie wykonuje zadań w tle. Czy działanie, które otwiera odbiornik Broadcast, czeka, aż użytkownik sprawdzi telefon i zobaczy go, ale nie chcę dodawać flagi 'KEEP_SCREEN_ON', dlatego czasami działanie jest otwarte przy wyłączonym ekranie (lub ekranie wyłącza się, gdy czynność jest otwarta). –

Odpowiedz

20

Twój cel nie może zostać stabilnie osiągnięty dzięki twojemu podejściu. Jeśli użyjesz metody Handler's postDelayed(), a procesor przejdzie w stan uśpienia, licznik ms zatrzyma się i będzie kontynuowany tylko wtedy, gdy CPU ponownie się obudzi.

See this for more detail.

Więc jeśli chcesz mieć jakieś zadanie cron będzie trzeba użyć blokada wybudzenia. szczęście jest realizacja usługi, która robi dokładnie to: Wakeful IntentService

Od doc:

Zalecany wzór na ekwiwalent Android do Cron pracy i systemu Windows zaplanowanych zadań jest wykorzystanie AlarmManager. Działa to dobrze w połączeniu z IntentService, ponieważ usługa wykona swoją pracę w wątku w tle i przestanie działać, gdy nie będzie już więcej pracy. Jest jeden mały problem: IntentService nie robi nic, aby utrzymać urządzenie w stanie czuwania. Jeśli alarm był wariantem WAKEUP, telefon pozostanie obudzony samodzielnie, podczas gdy BroadcastReceiver obsługujący alarm jest w swojej metodzie onReceive(). W przeciwnym razie telefon może ponownie zasnąć. WakefulIntentService próbuje walczyć z tym poprzez połączenie łatwości IntentService z częściowym WakeLockiem.

+0

Nieźle, ale nie spełnia moich wymagań, po prostu utrzymuje procesor z WakeLock, tak jak ja. Pytanie brzmi: naprawdę potrzebuję częściowego WakeLocka, aby mój Handler działał, gdy ekran jest wyłączony, a aktywność wzrośnie? W moim urządzeniu działa bez WakeLock, ale nie wiem, czy to tak działa wszystkie telefony z Androidem, czy zależy od specyfikacji urządzenia. Jeśli tak, chcę wiedzieć, kto to powiedział, lub gdzie pojawia się w dokumentacji, ponieważ nie mogę nic znaleźć. Dziękuję za odpowiedź, która przyda się w niektórych innych sprawach, CWAC ma kilka fajnych bibliotek. –

+0

Jako alternatywa, czy wypróbowałeś AlarmManager.setInexactRepeating(), alarm powtarzający moc, który wysyła intencję, gdy alarm się wyłączy? http://developer.android.com/reference/android/app/AlarmManager.html – for3st

+0

Niektóre Handlery wykonują 2/3 razy na sekundę, więc myślę, że używanie AlarmManagera jest złym pomysłem. Mam wszystko dobrze i działa i nie zużywa dużo baterii, ale jeśli mogę sprawić, że aplikacja zużywa mniej baterii poprzez usunięcie WakeLock, to mam zamiar to zrobić. Jedynym i głównym pytaniem jest to, czy naprawdę potrzebuję używać WakeLocka, ponieważ w oficjalnej dokumentacji nie czytałem nigdzie, że potrzebuję tego, aby moduły obsługi działały, aw moim telefonie aplikacja działa idealnie bez WakeLock, ale nie wiem jak będzie działać na innych urządzeniach, ponieważ jedyne urządzenie z Androidem, którego mogę użyć, to moje: -/ –