我正在编写一个体育应用程序,需要跟踪季度/一半/期间的经过时间。经过的时间需要精确到秒。即使用户通过按下电源按钮明确将设备置于睡眠模式,游戏时钟也需要继续运行。
我的第一次尝试涉及使用Handler.postDelayed()每 200 毫秒触发一次时钟滴答声,并使用WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON来确保“时钟”不会因屏幕超时而停止。但我很快了解到,可以通过按下电源按钮手动使设备进入睡眠状态来绕过这种方法。此外,postDelayed() 方法正在经历一些时钟漂移,这显然是 run() 方法所花费时间的结果。实际数字仍然是准确的,但不是在用户容易理解的 5 秒边界上对齐 - 所涉及的计时器开始漂移,导致一些可以理解的用户混淆。
经过一番研究,我发现了使用服务、java timers、AlarmManager和PartialWakeLock来实现定时器的技术。服务本身并不能解决与设备进入睡眠相关的问题。Java 定时器和服务一样,不能解决设备休眠的问题。AlarmManager 似乎是一个好方法,但我担心这不是对 AlarmManager 的适当使用(即警报之间的间隔非常短)。使用 PartialWakeLock 看起来也很有希望,但它本身并不能解决我遇到的时钟漂移问题。
我将尝试结合使用 AlarmManager 和 PartialWakeLock。这个想法是 AlarmManager 将帮助对抗时钟漂移和 PartialWakeLock 以帮助保持代码简单(手指交叉)。我希望这种方法能够在节能、代码复杂性和用户期望之间取得合理的平衡。任何意见是极大的赞赏。
谢谢,
富有的