1

序章

AlarmManagerのドキュメントによると

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

Android には、この問題を解決するためのWakefulBroadcastReceiverも用意されています。

デバイス ウェイクアップ イベントを受信し、移行中にデバイスがスリープ状態に戻らないようにしながら、作業を Service に渡す BroadcastReceiver を実装する一般的なパターンのヘルパー。

このクラスは、部分的な wake lock の作成と管理を行います。これを使用するには、WAKE_LOCK 権限を要求する必要があります。

API レベル 11 以降、BroadcastReceiver はgoAsyncメソッドを提供します。これにより、レシーバーを 10 秒以上実行し続け、時間のかかるコードをバックグラウンド スレッドに移動できます。

質問

アラーム マネージャーのレシーバー (WakefulBroadcastReceiver ではなく、BroadcastReceiver から継承) で goAsync を呼び出して、時間のかかるコードの新しいスレッドを開始すると、goAsync から返された pendingResult で終了を呼び出すまで、アラーム マネージャーはウェイク ロックを保持します。新しいスレッドで実行するコードでウェイク ロックを取得する必要がありますか?

4

1 に答える 1