2

(using )Serviceの使用を開始するように設定されるを作成しています。私は主に次の理由でメソッド内ですべての処理を行います。AlarmManagerELAPSED_REALTIME_WAKEUPonStartCommand

  1. それほど時間はかかりません(ディスクから小さなファイルを読み取り、おそらくを介して通知をプッシュしますNotificationManager
  2. 必要に応じて、別のプロセスで開始するように簡単に設定できます。

このような状況でも、WakeLockを取得する必要がありますか?

私の知る限り、WakeLockを取得する必要があるのは、個別のスレッドを作成する場合のみです(OSはメインスレッドをアイドル状態と見なしてスリープ状態になるため)。それは本当ですか、それとも私はまだOSによって中断される危険があります...居眠りしていますか?

4

1 に答える 1

5

注意してください-現在、ウェイクアップアラームをサービスに直接配信するべきではありません。サービスへの配信は、受信者への配信とは異なります。アラームマネージャは、サービスの実行がいつ完了したかを知ることができないため、onStartCommand()が呼び出されるまで、サービスがウェイクロックを保持していることを確認できません。

したがって、これを行うには、アラームが送信されるレシーバーが必要です。そのレシーバーはウェイクロックを取得し、startService()を呼び出してサービスを実行し、ウェイクロックを解除しないようにします。サービスが完了するまで。はい、申し訳ありませんが、これは最悪です。:(私はマークか誰かがこれのためのヘルパーコードを持っているかもしれないと思います。

これを単純化できる1つの方法は、サービスがすでに実行されているときに何が起こるかだけを気にする場合です。Context.peekService()をonReceiveIntent()内で使用して、現在実行中のサービスを取得できます。また、レシーバーでそれを呼び出して、ウェイクロックを保持している間に重要なコードを実行することができます。さらに、これらが同じプロセスで実行される一般的なケースを使用している場合は、サービスドキュメントに示されているのと同じトリックを使用して、補助ファイルを作成せずに直接呼び出すことができます。

于 2011-05-30T17:48:17.740 に答える