【发布时间】:2011-06-22 12:53:07
【问题描述】:
我正在编写一个体育应用程序,它需要跟踪季度/半/周期的经过时间。经过的时间需要精确到秒。即使用户通过按下电源按钮明确将设备置于睡眠模式,游戏时钟也需要继续运行。
我的第一次尝试涉及使用 Handler.postDelayed() 来触发每 200 毫秒的时钟滴答声和 WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON 以确保“时钟”是不会因屏幕超时而停止。但我很快了解到,可以通过按下电源按钮手动使设备进入睡眠状态来绕过这种方法。此外,postDelayed() 方法正在经历一些时钟漂移,这显然是由于 run() 方法所花费的时间造成的。实际数字仍然是准确的,但不是在用户容易理解的 5 秒边界上对齐 - 所涉及的计时器开始漂移,导致一些可以理解的用户混淆。
经过一番研究,我发现了使用服务java timers、AlarmManager 和PartialWakeLock 来实现计时器的技术。服务本身并不能解决与设备进入睡眠相关的问题。 Java 计时器和服务一样,不能解决设备进入睡眠状态的问题。 AlarmManager 似乎是一个好方法,但我担心这不是 AlarmManager 的适当使用(即警报之间的间隔非常短)。使用 PartialWakeLock 看起来也很有希望,但它本身并不能解决我遇到的时钟漂移问题。
我将尝试结合使用 AlarmManager 和 PartialWakeLock。这个想法是 AlarmManager 将帮助对抗时钟漂移和 PartialWakeLock 以帮助保持代码简单(手指交叉)。我希望这种方法能够在节能、代码复杂性和用户期望之间取得合理的平衡。非常感谢任何建议。
谢谢,
丰富
【问题讨论】:
-
使用 PartialWakeLock 您不会看到任何漂移,但您的电池会耗尽。
-
您说“经过的时间需要精确到秒”。为什么不使用简单的系统时间(如 System.currentTimeMillis())?只需保存开始时的时间戳,然后在需要时从当前时间中减去它
标签: android timer clock persistent reliability