Piszę aplikację sportową, która musi śledzić upływ czasu w kwartale/pół/okresie. Upływający czas musi być dokładny do drugiego. Zegar gry musi nadal działać, nawet jeśli użytkownik jawnie umieszcza urządzenie w trybie uśpienia, naciskając przycisk zasilania.Zegar z Androidem, który działa, gdy urządzenie śpi
Moja pierwsza próba to zaangażowany użyciu Handler.postDelayed() wywołać zegar tyka co 200ms i WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON aby upewnić się, że „zegar” nie został zatrzymany przez Wygaszanie ekranu. Wkrótce jednak dowiedziałem się, że można obejść to podejście, naciskając przycisk zasilania, aby ręcznie uśpić urządzenie. Ponadto metoda postDelayed() doświadcza pewnego dryfu zegara, najwyraźniej wynikającego z czasu spędzonego w metodzie run(). Rzeczywiste liczby są nadal dokładne, ale zamiast być wyrównane, na przykład na 5-sekundowych granicach, które są łatwo zrozumiałe dla użytkowników - czasomierze zaczynają dryfować, co powoduje pewne zrozumiałe dezorientację użytkownika.
Po kilku badaniach znalazłem techiques do korzystania z usług, java timers, AlarmManager i PartialWakeLock do realizacji timerów. Usługi same w sobie nie rozwiążą problemu związanego ze spaniem urządzenia. Liczniki czasu Java, podobnie jak usługi, nie rozwiązują problemu z uśpieniem urządzenia. AlarmManager wydaje się być dobrym podejściem, ale obawiam się, że nie jest to właściwe użycie AlarmManagera (tj. Bardzo krótkie przerwy między alarmami). Korzystanie z PartialWakeLock również wygląda obiecująco, ale samo w sobie nie rozwiązuje problemu z dryftem zegara, którego doświadczam.
Mam zamiar wypróbować połączenie AlarmManager i PartialWakeLock. Pomysł polega na tym, że program AlarmManager pomoże w walce z dryfem zegara i PartialWakeLock, aby pomóc w uproszczeniu kodu (skrzyżowanie palców). Mam nadzieję, że takie podejście zapewni rozsądną równowagę pomiędzy oszczędzaniem energii, złożonością kodu i oczekiwaniami użytkowników. Wszelkie porady są mile widziane.
Dzięki,
Rich
użyciu PartialWakeLock nie będzie widać żadnego dryfu, ale bateria będzie drenażu. – NitZRobotKoder
Powiedziałeś, że "Czas, który upłynął, musi być dokładny do sekundy". Dlaczego nie używasz prostego czasu systemowego (jak System.currentTimeMillis())? Wystarczy zapisać znacznik czasu na początku, a następnie odjąć go od bieżącego czasu, gdy jest to potrzebne – Dmitry