2011-09-05 24 views
33

我的應用需要每天在特定時間從網絡抓取一些數據。所以我使用AlarmManager來安排任務,並且工作正常。我應該在AlarmManager中使用PendingIntent.getService()還是getBroadcast?

但是,當看到各種例子時,當涉及待定意圖時,似乎有兩種方法可以處理AlarmManager。

一旦使用PendingIntent.getBroadcast()在警報關閉時調用廣播接收器,並在該接收器內啓動真正的工作服務。

另一種方法是使用PendingIntent.getService()並在警報關閉時直接調用該服務。

有人可以向我解釋兩種方法之間的差異,所以我可以決定哪一個依靠?

編輯:另一個問題是在使用getService()時,在哪裏獲取喚醒鎖?

例如,使用廣播接收器,當我在的onReceive()以下行:

WakeReminderIntentService.acquireStaticLock(context); 

我應該如何獲取喚醒鎖,如果我不是直接調用服務,如:

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

我應該直接從服務內取得嗎?

+0

這其實並不重要。您可以使用IntentService或Service,或者本地或全局廣播。你應該可以在他們所有人都這樣做。 –

回答

16

一旦使用PendingIntent.getBroadcast()撥打broadcast receiver,當鬧鐘響起時,在該接收器內部開始進行實際工作的服務。

它在啓動時有一個服務多走一步比

另一種方法是使用PendingIntent.getService()和直接調用服務時警報響起。

,那麼你應該使用第二種方法,因爲它是減少執行您的一步..

+1

「那麼你應該使用第二種方法,因爲它減少了執行中的一步」:如果這是唯一的區別,當然是的。但我想知道是否有一個更微妙的差異,可能會影響性能等 – marlar

+0

我不認爲有什麼會影響性能.. –

+0

謝謝。請看我更新的問題。 – marlar

11

閱讀你的編輯我想你發現了自己:如果你想確保你的服務是開始使用時你最好先繞行發送給接收器,並在那裏獲取喚醒鎖。 否則,在請求的服務啓動之前,手機可能會睡眠。 這就是javadoc of AlarmManager所說的,我也在Google engineer的帖子中看過它。

所以,現在爲您編輯:何時獲取鎖? 使用接收器的關鍵在於獲取接收器的onReceive()方法中的鎖,因爲在執行此方法期間Android不會入睡。

舉個例子,看這個question

相關問題