3

コードの小さなチャンクを頻繁に実行する必要があるアプリケーションを開発しています (たとえば、2 秒に 1 回)。シンプルな Thread.sleep() (または android.os.SystemClock.sleep() を使用して割り込みを回避し、最後に Timer と Handler で試しました) を使用して動作させようとしましたが、結果は時間プログラムがスリープするのはランダムです(または、タイマーまたはハンドラーを使用すると、画面がオフのときにシステムがメッセージを破棄するため、単に実行されません)。画面がオフのときにシステムがディープスリープモードになるためです。

たとえば、電話が充電器に接続されている場合、または音楽を再生している場合 (ディープ スリープ モードを回避する場合)、コードは正常に動作しますが、電話が何もしていない場合、時間は 2 秒のスリープから数分まで増加する可能性があります。寝る。

https://groups.google.com/forum/#!topic/android-developers/Eqwp8Uiy2f0から、唯一の代替手段は AlarmManager を使用して強制的にスリープを解除することですが、その方法ではおそらくバッテリーの消耗が多すぎます。

代替手段はありますか?

そうでない場合、システムがいつディープ スリープ モードに移行したかを検出する方法はありますか?

4

1 に答える 1

3

手遅れですが、他の誰かに役立つかもしれません。はい、タイマーはディープ スリープ モードでは機能しません。ディープ スリープ モードで定期的に何かを実行するには、AlarmManager 以外に良い方法はないと思います。また、頻度はわずか 2 秒であるため、要件が時間内に重要である場合、通常のアラームはより適切に機能しない可能性があるため、正確なアラーム ( setExact() ) を使用する必要があると思います。また、setExact でさえ、私が観察した wake lock をキャプチャしない場合があります。そのため、独自の (PARTIAL_..) ウェイクロックを取得し、何かを実行してロックを解放する必要があります。しかし、2秒ごとに実行する必要がありますか? デバイスのウェイクアップ後に自動的に動作し続けるタイマーを使用し続けない場合。AlarmManagerまたは Handler を使用する必要がありますか? をご覧ください。

于 2014-11-10T15:14:57.493 に答える