私は、四半期/半期/期間の経過時間を追跡する必要があるスポーツアプリを書いています。経過時間は秒まで正確である必要があります。ユーザーが電源ボタンを押して明示的にデバイスをスリープモードにしても、ゲームクロックは継続して動作する必要があります。この時デバイスがスリープ状態のときに動作するAndroidタイマー
私の最初の試みは、クロックをトリガするHandler.postDelayed()を使用して関与「時計」は、画面のタイムアウトによって停止されなかったことを確認するために、すべての200msとWindowManager.LayoutParms.FLAG_KEEP_SCREEN_ONを刻みます。しかし、私はすぐに電源ボタンを押して手動でデバイスをスリープ状態にすることでこの方法を回避することが可能であることを学びました。さらに、postDelayed()アプローチでは、クロックドリフトが発生しています。これは明らかにrun()メソッドで費やされた時間の結果です。実際の数はまだ正確ですが、例えば、ユーザーが容易に理解できる5秒の境界で整列するのではなく、関連するタイマーがドリフトし始め、ユーザーの混乱を招きます。
少しの調査の結果、サービスを使用するためのテクニック、すなわちタイマを実装するために、java timers、AlarmManager、およびPartialWakeLockが見つかりました。サービス自体はスリープ状態になるデバイスに関連する問題を解決しません。 Javaタイマーはサービスのように、スリープ状態になるデバイスの問題を解決しません。 AlarmManagerは良いアプローチだと思われますが、これはAlarmManagerの適切な使用(つまり、アラーム間の間隔が非常に短い)ではないことが懸念されます。 PartialWakeLockを使用することも有望ですが、それだけでは私が経験しているクロックドリフトの問題に対処できません。
私は、AlarmManagerとPartialWakeLockの組み合わせを試みます。このアイデアは、AlarmManagerがクロックドリフトやPartialWakeLockとの戦いを助け、コードを単純なものに(指が交差して)維持するのを助けるということです。私は、このアプローチが省電力、コードの複雑さ、ユーザーの期待との間で妥当なバランスをもたらすことを期待しています。アドバイスをいただければ幸いです。
おかげで、
リッチ
。 – NitZRobotKoder
あなたは、「経過時間は秒まで正確である必要がある」と言った。なぜ単純なシステム時間(System.currentTimeMillis()のような)を使用しないのですか?開始時にタイムスタンプを保存し、必要なときに現在の時刻から減算するだけです – Dmitry