我正在编写一款体育应用程序,需要跟踪节/半场/周期经过的时间。经过的时间需要精确到秒。即使用户通过按下电源按钮明确将设备置于睡眠模式下,游戏时钟也需要继续运行。
我首次尝试使用Handler.postDelayed()触发时钟每200毫秒进行滴答声并使用WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON确保“时钟”不会被屏幕超时停止。但我很快发现可以通过按电源按钮手动将设备置于睡眠状态来规避此方法。此外,postDelayed()方法存在一些时钟漂移问题,似乎是由于在run()方法中花费的时间所致。实际数字仍然准确,但与用户轻松理解的例如5秒边界对齐相比,所涉及的计时器开始漂移,导致某些可以理解的用户困惑。
经过一番研究,我发现可使用服务、java定时器、AlarmManager和PartialWakeLock技术来实现计时器。服务本身无法解决设备进入睡眠状态的问题。像服务一样,Java定时器也不能解决设备进入睡眠状态的问题。AlarmManager似乎是一个很好的方法,但我担心这不是AlarmManager的适当用法(即,在警报之间非常短的时间间隔)。单独使用PartialWakeLock看起来很有前途,但它本身并不能解决我正在遇到的时钟漂移问题。
我将尝试结合使用AlarmManager和PartialWakeLock。其想法是AlarmManager将有助于抵消时钟漂移,PartialWakeLock将有助于保持代码简单(手指交叉)。我希望这种方法将在节约电力、代码复杂度和用户期望之间取得合理平衡。非常感谢任何建议。
感谢您,Rich。