2010-07-23 149 views
0
  1. 廣播接收器接收廣播,打開激活鎖定,啓動服務
  2. 服務打開另一個激活鎖定,然後發送「釋放激活鎖定」播出
  3. 廣播接收器接收釋放激活鎖定廣播和釋放其激活鎖定
  4. 服務做它的東西,並釋放其激活鎖定

還有一個問題,但。目前,BroadcastReceiver將其WakeLock作爲成員變量存儲。有時候,垃圾收集器將運行的BroadcastReceiver啓動該服務後,卻收到釋放激活鎖定播出前,然後我得到接近力,因爲激活鎖定定稿被釋放之前(因爲它會收集的垃圾)。Android BroadcastReceiver等待服務啓動或將WakeLock傳輸到服務?

所以我需要在的onReceive方法,請執行下列操作之一:

  • 等待服務啓動,等待它建立其激活鎖定,然後鬆開廣播接收器激活鎖定;在「釋放激活鎖定」廣播將不再需要
  • ,或以某種方式激活鎖定傳輸到服務,那麼該服務會負責釋放單激活鎖定

哪一個是更好的選擇,我將如何完成它?

回答

0

使用靜態WakeLock。更好的是,使用我的WakefulIntentService,它涵蓋了整個模式。

+0

是否有任何理由不去消除服務並在我的BroadcastReceiver中實現一切?我想也許我一直在給予服務的想法太多,也許所有這些都是不必要的。實際上,我甚至不需要任何喚醒鎖,因爲系統在onReceive方法期間建立了一個WakeLock(在這個方法中我將盡其所能)。 – Ricket 2010-07-23 22:58:05

+0

「是否有任何理由不去消除服務並在我的BroadcastReceiver中實現所有內容?」 - 如果要完成的工作很快(例如50ms),那麼我會把它全部放入接收器。否則,您將從前臺進程中竊取大量CPU時間,並且在您的活動恰好處於前臺時綁定主要應用程序線程。 '的onReceive()'有前景的優先級運行,所以如果你正在做認真的工作,您可以享受足夠的CPU週期來重擊遊戲用戶可能在當時被打的幀速率。 – CommonsWare 2010-07-24 01:07:57