13

私は、一部のHandlersで5分を超えない間隔で実行されているアクティビティを持っています。アクティビティはBroadcastReceiverから開始され、ユーザが電話を拾ってユーザ入力を待って画面を表示して起動することがあります。この場合、アクティビティonPause()が呼び出され、確実にCPUがスリープモードになっています。私はできるだけ多くのバッテリーを節約したいので、画面をオンにするように設定していません。CPUがスリープしているときにハンドラpostDelayedが起動されませんか?

私は自分の携帯電話でそれをテストして、実際にはうまく動作していますが、画面はすべてオフになっています。Handlersは実行する必要があるすべてのコードを実行します。アクティビティが開いているときに画面をオンまたはオフにすると、すべて正常に動作します。

ここでは、画面が消えてCPUがスリープすると、一部のデバイスが期待通りに動作しないことがあります。ほとんどの場合、加速度計を使用しています。今私の質問は、WakeLockを取得する必要がありますので、私の活動が開いている間CPUがスリープ状態にならないのですか?前に言ったように、私は高価なWakeLockを買うことによってバッテリーを無駄にしたくないから、本当にこれを知りたいです。

これは実際にどのように動作するかを知っている人の詳細な回答を希望します。

+0

なぜバックグラウンドタスクを実行するためにアクティビティを使用していますか?アクティビティは、タスクを表示するために使用され、タスクは実行されません。サービスを調べましたか? – tolgap

+0

いいえ、アクティビティはバックグラウンドタスクを実行していません。放送受信機で開いているアクティビティは、ユーザが電話を確認して見るのを待っていますが、フラグ 'KEEP_SCREEN_ON 'を追加したくありません。そのため、アクティビティがスクリーンオフ(または画面アクティビティが開いている間はオフになります)。 –

答えて

20

あなたの目標は、あなたのアプローチでは安定して達成できません。ハンドラのpostDelayed()メソッドを使用し、CPUがdeepsleepに行くと、msカウンタは停止し、CPUが再び起動すると続行されます。

See this for more detail.

あなたはcronジョブのいくつかの種類を持っているしたいのであれば、あなたはwakelockを使用する必要があります。

ジョブとWindowsのスケジュールされたタスクをcronにAndroidの同等のための推奨パターンはAlarmManagerを使用することです:DOCからWakeful IntentService

: は幸いまさにそのサービスの実装があります。これはIntentServiceと組み合わせるとうまくいきます。サービスはバックグラウンドスレッドで作業を行い、それ以上の作業がないときにシャットダウンするためです。小さな問題が1つあります:IntentServiceは、デバイスを目覚めさせるために何もしません。アラームがWAKEUPの亜種だった場合、電話機は単独で起床しますが、アラームを処理するBroadcastReceiverはonReceive()メソッド内にあります。そうしないと、電話がスリープ状態に戻ることがあります。 WakefulIntentServiceは、IntentServiceの容易さと部分的なWakeLockを組み合わせることで、これと戦いを試みます。

+0

悪いですが、私の要求を満たしていません.WakeLockを使ってCPUを保つだけです。問題は、画面が消えてアクティビティがアップしている間にHandlerを動作させるために、私は実際に部分WakeLockが必要なのですか?私のデバイスではWakeLockなしで動作しますが、それがすべてのAndroid携帯が動作するか、デバイス仕様に依存するかどうかはわかりません。もしそうなら、私は何も見つけることができないので、誰がそれを話したのか、またはドキュメンテーションに現れるのかを知りたい。あなたの返事をありがとう、それは他のものに便利になるでしょう、CWACはいくつかのクールな図書館を持っています。 –

+0

altenativeとして、AlarmManager.setInexactRepeating()を試してみましたか?アラームが鳴ったときにIntentを送信する電源セーフリピートアラームですか? http://developer.android.com/reference/android/app/AlarmManager。html – for3st

+0

いくつかのハンドラは毎秒2/3回実行されるので、AlarmManagerを使用するのは悪い考えです。私はすべてがうまく動作しており、バッテリーを多用しないが、WakeLockを取り除くことでアプリのバッテリー消費を少なくすることができれば、それをやるつもりだ。唯一の主な問題は、私が実際にWakeLockを使用する必要があるかどうかです。なぜなら、公式のドキュメントでは、ハンドラのために必要な場所を私が読んでいないので、私の電話ではアプリケーションがWakeLockなしでも完璧に動作するからです。 -/ –

関連する問題