2011-04-15 118 views
4

即時接收廣播接收器的意圖,然後我開始服務做更多的工作。現在如果設備是睡眠並且發生這種情況,我必須得到Wakelock(AlarmManger?),爲什麼我需要它? 如果設備在沒有喚醒的情況下進入睡眠狀態,我的服務將停止運行。廣播接收器,服務和Wakelock

回答

5

現在如果設備是睡眠,這發生了什麼,我必須得到Wakelock(AlarmManger?),爲什麼我需要它?

如果設備先睡着了,您將不會「收到廣播接收方的意圖」,因爲設備處於睡眠狀態。

我必須得到Wakelock(AlarmManger?),爲什麼我需要它?

除非要確保設備在完成某些工作時保持運行狀態,否則不需要它。

如果設備在沒有獲得喚醒鎖的情況下進入睡眠狀態,我的服務將停止運行。

是的。

+0

對於第一部分,我的意思是我會收到來自C2DM的意圖,我猜你可以在設備處於睡眠狀態時收到它。然後我想運行一個服務,我想我必須讓wakelock保持運行。這些假設是否正確? – Jimmy 2011-04-15 19:15:56

+0

@Fevos:「我的意思是我會收到C2DM的意圖,我想你可以在設備睡着的時候收到它。」 - 是的,C2DM通過無線數據(AFAIK)使用套接字連接,並且該連接上的傳入數據包將簡短*喚醒設備。 「然後我想運行一項服務,我想我必須讓wakelock繼續運行,這些假設是正確的嗎?」 - 是的,你會想要自己的'WakeLock'。只要確保完成後即可發佈。 – CommonsWare 2011-04-15 19:20:41

+0

太棒了!謝謝。 – Jimmy 2011-04-15 19:26:35

0
public class WakeLockManager extends BroadcastReceiver { 

    private static WakeLock mWakeLock; 
    private String LCLT; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) { 
      Log.v("wakelock", "GOT THE wakelock INTENT"); 
      boolean on = intent.getExtras().getBoolean("on"); 
      if (mWakeLock == null) { 
       PowerManager pm = (PowerManager) context 
         .getSystemService(Context.POWER_SERVICE); 
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
         "Breeze WakeLock"); 
      } 
      if (on) { 
       if (!mWakeLock.isHeld()) { 
        mWakeLock.acquire(); 
        Log.v("wakelock", "acquiring wakelock"); 
       } 
      } else { 
       if (mWakeLock.isHeld()) { 
        Log.v("wakelock", "releasing wakelock"); 
        mWakeLock.release(); 
       } 
       mWakeLock = null; 
      } 
     } 
    } 
} 

看看上面的代碼..put在一個單獨的類文件,並在您的清單中定義它的一些自定義的意圖....現在,這個類將一個自定義的意圖迴應...只是播出的意圖,你可以在你的整個應用程序打開激活鎖定或關閉,因爲激活鎖定是static..like這樣的:

public void setWakeup(boolean status) { 
    Intent wakelock_Intent = new Intent(CUSTOM_INTENT); 
    wakelock_Intent.putExtra("on", status); 
    this.sendBroadcast(wakelock_Intent); 
} 

以上將被定義在alarmmanager代碼,以便它安排一個電話

+0

你確定這個「靜態鎖定「將不會在Receiver'class'卸載時被擦除?請參閱:http://stackoverflow.com/questions/6299283/broadcastreciever-life-cycle-static-variables#comment7376537_6299862 – 2013-04-25 15:03:25

+0

我假設該對象不會被垃圾收集,因爲這不是一個匿名的broadcastReceiver。如果我自己分配這個對象並保持對它的一個硬引用,爲什麼它會被系統釋放?這是一個有趣的話題,請指教。 – j2emanue 2013-04-26 20:32:10

1

看起來像Android的本地WakefulBroadcastReceiver將是一個完美的解決方案。需要在「清醒」的方式,而擴大這種比普通廣播接收器並開始在的onReceive(服務)

startWakefulService(context, service); 

,並顯示你的工作是在服務的onHandleIntent()完成 ,打電話

MyWakefulReceiver.completeWakefulIntent(intent);