Back in 2010,我們被告知,與AlarmManager
和_WAKEUP
風格報警的唯一保證是如果我們用廣播PendingIntent
,然後的Android將保持清醒設備足夠長onReceive()
完成。任何其他類型的PendingIntent
都沒有這種保證。
但是,在主應用程序線程上調用BroadcastReceiver
的onReceive()
,我們無法安全地在此處花費太多時間。理想情況下,這是毫秒級的,至於你所知道的,你的用戶界面恰好在前臺,而你不希望這個接收器引起混亂。
所以,配方變成了:
- 有報警觸發
BroadcastReceiver
- 有接收器獲取
WakeLock
- 有接收器工作委託給一個
Service
,通常是IntentService
- 當工作完成後,服務發佈
WakeLock
My WakefulIntentService
是第一個爲此配方提供支持的圖書館。後來過來了WakefulBroadcastReceiver
。它們都以不同的語義完成相同的目標。
請注意,「爲什麼我們不只是在服務中獲得WakeLock
?」因爲設備可能會在onReceive()
結束與服務可能有機會獲得WakeLock
的第一個位置之間入睡。
現在,對於其他情況,不涉及AlarmManager
,服務管理自己的WakeLock
是完全合理的。事實上,這是我帶着特殊的IntentService
(WakefulIntentService
)而不是特殊的BroadcastReceiver
(WakefulBroadcastReceiver
)去的原因之一。
舊的Google C2DM庫使用了相同的想法 –