私のアプリは、毎日特定の時間に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);
代わりに、サービス内から取得する必要がありますか?
アラームが鳴り、レシーバー内で実際の作業を行うサービスが開始されると、PendingIntent.getBroadcast()
を使用して_broadcast receiver
_を呼び出します。
サービスを開始する際のステップが1つ多い
別のアプローチは、PendingIntent.getService()
を使用し、そのアラームが鳴ったときにサービスを直接呼び出すことです。
次に、2番目のアプローチを使用する必要があります。これは、実行中の1つのステップを削減するためです。
あなたの編集を読んでいると思います:AlarmManager
を使用しているときにサービスが開始されていることを確認したい場合は、最初にレシーバーに送信することの迂回を行うことをお勧めしますさもなければ、要求されたサービスが開始される前に電話がスリープ状態になる可能性があります。それが AlarmManager
のjavadocの発言であり、私は Googleエンジニア による投稿でも読んでいます。
さて、編集のために:いつロックを取得するのですか? Androidはこのメソッドの実行中にスリープ状態にならないため、レシーバーを使用する目的は、レシーバーのonReceive()
メソッド内でロックを取得することです。
例については、この 質問 を参照してください。