2011-05-30 105 views
2

我正在創建一個Service,它將被設置爲開始使用AlarmManager(使用ELAPSED_REALTIME_WAKEUP)。我做onStartCommand方法在我的所有的處理,主要是因爲:如果我不創建線程,是否需要獲取WakeLock?

  1. 它並不需要很長時間(從磁盤中讀取小的文件,也許通過NotificationManager推送通知)
  2. 我可以很容易地將它設置在單獨的開始過程如果我需要。

在這些情況下,我還需要獲得WakeLock嗎?

據我所知,只有在創建單獨的線程時(因爲操作系統將主線程看作空閒並進入休眠狀態),您必須獲得一個WakeLock。這是真的還是我仍然有可能被操作系統打斷...打瞌睡?

回答

5

當心 - 目前您不應該有喚醒警報直接傳送到服務。交付服務不同於交付給接收者;警報管理器無法知道服務何時執行完畢,所以無法確保它爲您保留喚醒鎖,甚至可以調用onStartCommand()。

因此,要做到這一點,您需要有一個發送警報的接收器,在該接收器中獲取喚醒鎖,然後調用startService()來執行服務並確保您不會釋放喚醒鎖直到服務完成。對不起,這很糟糕。 :(我認爲馬克或其他人可能有這樣的幫手代碼

你可以簡化這一點的一種方法是,如果你只關心服務已經運行時會發生什麼,Context.peekService()可以用在onReceiveIntent )來獲取當前正在運行的服務,並且您可以在接收器中調用它,以便在您持有喚醒鎖時執行關鍵代碼。此外,如果您正在使用在同一進程中運行的常見情況,可以使用Service doc中顯示的相同技巧直接調用它,而無需編寫一個aidl文件。

+3

「我認爲Mark或某人可能有此幫助程序代碼。」 - 這可能是指我的'WakefulIntentService' :https://github.com/commonsguy/cwac-wakeful – CommonsWare 2011-05-30 18:11:28

相關問題