0

「アンドロイドのウェイクロックがどのように機能するか」について、誰かが説明したり、良い説明を教えてくれたりできますか? そのための Android 標準ドキュメントは忘れて構いません。

サービス (フォアグラウンドとして開始) があり、サービス内で独自のスレッドが開始されます。ユーザーがサービスを停止するまで、スレッドはループのままです。ループ内で、スレッドは HTTP 要求を実行します。応答から、スレッドは次の HTTP 要求が実行される遅延 (1 分以上) を認識します。

ディスプレイがオンの場合、HTTP リクエストは正確な予想時間内にサーバーに到達します。しかし、ディスプレイがオフの場合、遅延はどういうわけかランダムです. 例えば ​​1 分の場合、実際には 2:21、4:04、4:40、... しかし、表示オフ (ディープ スリープ モードと呼ばれることを想定) の場合も正確なタイミングが必要です。

そこでHTTPリクエストのwakelock.acquire()前後を導入しましたが、これは何も変わりません。wakelock.release

しかし、それは私に一般的な質問を与えるだけです:

wakelock.acquire()電話がスリープ状態になっているときに、コードをどのように起動して実行するのでしょうか? に到達した場合wakelock.acquire()、それは必要ありませんか、それとも...?

わかりました、おそらくディープスリープで私のコードも実行されますが、IP トラフィックなどの特定のものは実行されません。しかし、それはうまくいくはずです。

logcat ログから、時間内に呼び出されていないことがわかりwakelock.acquire()ます。それで、それの使用法は何ですか?サービスまたはそのスレッドを開始するときに実行できませんwakelock.acquire()。これは、30 分の時間枠で HTTP 要求を行いたい場合でも、サービスが電話をスリープ状態にしないことを意味するためです。

wakelock.acquire()私はむしろ、電話がディープスリープするのを妨げて、サービスを生涯にわたってしか作成できないとは信じられません。

4

1 に答える 1

0

一般に、wake lock は画面または CPU のみをオンに保ちます。電話がすでにスリープ状態になっている場合、電話はウェイクアップしません。この動作を変更するために wake lock を作成するときに ACQUIRE_CAUSES_WAKEUP を渡すことができますが、ディープ スリープ中の Android の動作のために、それでも期待どおりの動作にはなりません。基本的に、Wakelock.acquire() への呼び出しは、Android がスリープ モードで動作するため、常に遅すぎます。スリープ状態であるため、必要なときにのみコードを実行します。

バックグラウンドで非常に特定の時間に更新を行う必要があるため、ELAPSED_REALTIME_WAKEUP または RTC_WAKEUP フラグのいずれかと一緒に AlarmManager.set を使用する必要があるようです。可能であれば setInexactRepeating() を使用してください。その理由 (バッテリー寿命) についてはhttp://www.google.com/events/io/2009/sessions/CodingLifeBatteryLife.htmlを参照してください。

于 2013-07-10T23:43:25.860 に答える