web-dev-qa-db-ja.com

PendingIntent.getService()またはgetBroadcastをAlarmManagerで使用する必要がありますか?

私のアプリは、毎日特定の時間にWebからいくつかのデータを取得する必要があります。したがって、AlarmManagerを使用してタスクをスケジュールし、それは問題なく動作します。

しかし、さまざまな例を見ると、保留中のインテントに関して、AlarmManagerを処理する方法が2つあるようです。

アラームが鳴ったときにPendingIntent.getBroadcast()を使用してブロードキャストレシーバーを呼び出し、そのレシーバー内で実際の作業を行うサービスが開始されます。

別のアプローチは、PendingIntent.getService()を使用し、そのアラームが鳴ったときにサービスを直接呼び出すことです。

誰かが私に2つのアプローチの違いを説明して、どちらを信頼するかを決めることができますか?

編集:もう1つの質問は、getService()を使用するときにwake lockを取得する場所ですか?

たとえば、BroadcastReceiverを使用する場合、onReceive()に次の行があります。

WakeReminderIntentService.acquireStaticLock(context);

次のように直接サービスを呼び出す場合、ウェイクロックを取得するにはどうすればよいですか。

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

代わりに、サービス内から取得する必要がありますか?

43
marlar

アラームが鳴り、レシーバー内で実際の作業を行うサービスが開始されると、PendingIntent.getBroadcast()を使用して_broadcast receiver_を呼び出します。

サービスを開始する際のステップが1つ多い

別のアプローチは、PendingIntent.getService()を使用し、そのアラームが鳴ったときにサービスを直接呼び出すことです。

次に、2番目のアプローチを使用する必要があります。これは、実行中の1つのステップを削減するためです。

19
Vineet Shukla

あなたの編集を読んでいると思います:AlarmManagerを使用しているときにサービスが開始されていることを確認したい場合は、最初にレシーバーに送信することの迂回を行うことをお勧めしますさもなければ、要求されたサービスが開始される前に電話がスリープ状態になる可能性があります。それが AlarmManager のjavadocの発言であり、私は Googleエンジニア による投稿でも読んでいます。

さて、編集のために:いつロックを取得するのですか? Androidはこのメソッドの実行中にスリープ状態にならないため、レシーバーを使用する目的は、レシーバーのonReceive()メソッド内でロックを取得することです。

例については、この 質問 を参照してください。

13
schnatterer