クォーター/ハーフ/ピリオドの経過時間を追跡する必要があるスポーツ アプリを作成しています。経過時間は秒単位まで正確である必要があります。ユーザーが電源ボタンを押して明示的にデバイスをスリープ モードにした場合でも、ゲーム クロックは動作し続ける必要があります。
これを最初に試みたのは、Handler.postDelayed()を使用して 200 ミリ秒ごとにクロック ティックをトリガーし、WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ONを使用して、画面のタイムアウトによって「クロック」が停止しないようにすることでした。しかし、電源ボタンを押してデバイスを手動でスリープ状態にすることで、このアプローチを回避できることをすぐに知りました。さらに、postDelayed() アプローチでは、明らかに run() メソッドで費やされた時間の結果として、クロック ドリフトが発生しています。実際の数値は依然として正確ですが、たとえば、ユーザーが簡単に理解できる 5 秒の境界に合わせる代わりに、関係するタイマーがドリフトし始め、理解できるユーザーの混乱を招きます。
少し調査した後、サービス、Java タイマー、AlarmManager、およびPartialWakeLockを使用してタイマーを実装するためのテクニックを見つけました。サービス自体は、デバイスがスリープ状態になることに関連する問題を解決しません。Java タイマーは、サービスと同様に、デバイスがスリープ状態になる問題を解決しません。AlarmManager は良いアプローチのように思えますが、これは AlarmManager の適切な使用方法 (つまり、アラーム間の非常に短い間隔) ではないことを懸念しています。PartialWakeLock を使用することも有望に見えますが、それだけでは私が経験しているクロック ドリフトの問題には対処できません。
AlarmManager と PartialWakeLock の組み合わせを試してみます。アイデアは、AlarmManager がクロック ドリフトと戦うのに役立ち、PartialWakeLock がコードをシンプルに保つのに役立つ (指を交差させた) というものです。このアプローチにより、省電力、コードの複雑さ、およびユーザーの期待の間で合理的なバランスが得られることを願っています。どんなアドバイスでも大歓迎です。
ありがとう、
リッチ