7

私は WakeLock の概念に不慣れで、あなたの助けが必要です。

質問:

  1. WakeLock は、実行中のコードによって保持されると、デバイスがスリープ状態にならないようにする何らかのタイプのロックであると想定しています。デバイスが既にスリープ/スタンバイ モードになっている場合、コードは実行されますか? WakeLock を取得しないと仮定しますか?

  2. 長時間実行されるタスク (約 7 ~ 8 秒) がバックグラウンド スレッド (AsyncTask) で実行される場合、WakeLock を保持する必要がありますか? AsyncTask は既にそれを取得していますか?

  3. 公式ドキュメントへのリンクとウェイクロックに関する記事は大歓迎です。

ありがとう。

4

2 に答える 2

4

1. 電話機が完全なスリープ モードの場合、電話の着信は別として、AlarmManager インテントを使用して電話機を復帰させることができます。

AlarmManagerクラスのドキュメントから:

アラーム マネージャは、アラーム レシーバの onReceive() メソッドが実行されている限り、 CPU ウェイク ロックを保持します。これにより、ブロードキャストの処理が完了するまで電話がスリープ状態にならないことが保証されます。onReceive() が戻ると、Alarm Manager はこの wake lock を解放します。これは、onReceive() メソッドが完了するとすぐに電話がスリープする場合があることを意味します。アラーム レシーバーが Context.startService() を呼び出した場合、要求されたサービスが開始される前に電話機がスリープ状態になる可能性があります。これを防ぐには、BroadcastReceiver と Service で別の wake lock ポリシーを実装して、サービスが利用可能になるまで電話が動作し続けるようにする必要があります。

2. AsyncTask を使用している場合は結果を UI スレッドに公開する必要があります。onPostExecute()

AsyncTaskドキュメントから:

AsyncTask を使用すると、UI スレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を発行できます。

3. WakeLock の概念を紹介しているPower Managerの公式ドキュメントを読むことをお勧めします。

于 2010-11-23T04:08:13.727 に答える
3
  1. 通常、電話がスリープしているときに実行される唯一のコードはBroadcastReceiver. 実際には、電話が 1 秒間起動し、BroadcastReceiverのコードを実行して、再びスリープ状態になります。a で長いコードを実行するべきではないBroadcastReceiver(代わりに a を起動するために使用するService) ため、電話がスリープしている間はコードが実行されないと基本的に想定できます。もちろん、 を使用してBroadcastReceiverを起動しているService場合は、通常は WakeLock を取得する必要があります。

  2. ユーザーによって開始されたAsyncTask場合、WakeLocks について実際に心配する必要はありません。実行中に電話機がスリープ状態になることはほとんどありません。彼らがWakeLockを取得するかどうかはわかりAsyncTaskませんが、標準の実行中に携帯電話をスリープ状態にしても、それが中断されることはないようです.

  3. SteD が言ったように、これをチェックしてください: http://developer.android.com/reference/android/os/PowerManager.html

基本的に、WakeLocks について心配する必要があるのは、スリープによってタスクが中断されることが予想される場合 (電話を一時的に起こすアラームを設定した場合など)、またはタスクを絶対に中断できない場合のみです。それ以外の場合は、中断を適切に処理するようにしてください。

于 2010-11-23T04:15:49.413 に答える