Estoy escribiendo una aplicación deportiva que necesita rastrear el tiempo transcurrido de cuarto/medio/período. El tiempo transcurrido debe ser exacto al segundo. El reloj del juego debe continuar ejecutándose incluso si el usuario coloca el dispositivo en modo de suspensión presionando el botón de encendido.Temporizador Android que funciona cuando el dispositivo está durmiendo
Mi primer intento en este implicó el uso de Handler.postDelayed() para activar el reloj avanza cada 200 ms y WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON para asegurar que el "reloj" no fue detenido por un tiempo de espera de pantalla. Pero pronto aprendí que era posible eludir este enfoque presionando el botón de encendido para poner el dispositivo a dormir de forma manual. Además, el enfoque postDelayed() está experimentando una deriva de reloj, aparentemente como resultado del tiempo empleado en el método run(). Los números reales siguen siendo precisos, pero en lugar de alinearse, por ejemplo, en límites de 5 segundos que los usuarios entienden fácilmente, los temporizadores involucrados comienzan a desviarse, lo que genera una confusión comprensible para el usuario.
Después de investigar un poco encontré técnicas para usar los servicios, java timers, AlarmManager y PartialWakeLock para implementar temporizadores. Los servicios por sí solos no resolverán el problema asociado con el dispositivo que se va a dormir. Los temporizadores de Java, como los servicios, no resuelven el problema con el dispositivo que se va a dormir. AlarmManager parece ser un buen enfoque, pero me preocupa que este no sea un uso apropiado de AlarmManager (es decir, intervalos muy cortos entre alarmas). El uso de PartialWakeLock también parece prometedor, pero por sí mismo no soluciona el problema de la deriva del reloj que estoy experimentando.
Voy a probar una combinación de AlarmManager y PartialWakeLock. La idea es que AlarmManager ayude a combatir la deriva del reloj y ParcialWakeLock para ayudar a mantener el código simple (con los dedos cruzados). Espero que este enfoque resulte en un equilibrio razonable entre la conservación de energía, la complejidad del código y las expectativas del usuario. Cualquier consejo es muy apreciado.
Gracias,
Rich
usando PartialWakeLock no verá ninguna desviación, pero su batería se agotará. – NitZRobotKoder
Usted dijo que "el tiempo transcurrido debe ser preciso para el segundo". ¿Por qué no usa la hora del sistema simple (como System.currentTimeMillis()) ?? Solo guarde la marca de tiempo al inicio y luego restela de la hora actual cuando sea necesario – Dmitry