2012-04-18 47 views
5

我已經設置了一個重複時間的AlarmManagr。這裏是我的方法,通過它,我將它設置:AlarmManager不能在睡眠模式下工作

public void setAlarmManager(Context context, Intent intent) {   
    PendingIntent pendingIntent; 
    pendingIntent = PendingIntent.getService(context, 0, intent, 0);    
    AlarmManager alarmManager = 
     (AlarmManager)context.getSystemService(context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
           calendar.getTimeInMillis(), 
           40000, pendingIntent);     
} 

這工作時,我的設備進入睡眠模式的報警停止工作,直到我醒來手動我的設備,除了罰款。喚醒設備後,AlarmManager再次開始工作。

如何讓管理員即使在睡眠模式下也能正常運行?

+0

AlarmManager.set(AlarmManager.RTC_WAKEUP,...)對我來說工作得很好,沒有嘗試過AlarmManager.setRepeating()。也許這是相關的?不知道,只是想我會提 – SteelBytes 2012-04-18 08:56:54

+0

setRepeating只是在一段時間後重復任務。其餘的東西都一樣 – Reyjohn 2012-04-18 09:05:19

+0

任何人都可以給我一個解決方案嗎? – Reyjohn 2012-04-18 10:46:01

回答

6

這是因爲您的PendingIntent正在呼叫服務而不是撥打BroadcastReceiver,這意味着設備可以在創建服務之前重新進入睡眠狀態。如果您轉移到廣播接收器,它應「保持清醒狀態,直到onReceive完成BroadcastReceiver,這意味着您將有時間獲得喚醒鎖並開始您的服務。即使你轉移到BroadcastReceiver,如果需要10秒以上(這是BroadcastReceiver的限制),你將需要獲得喚醒鎖,直到完成處理。

這是從AlarmManager的Android文檔的第2款採取:

」 ......如果你的報警接收器,稱爲Context.startService(),有可能手機會睡所請求的服務推出之前,爲了防止這種情況。 ,您的BroadcastReceiver和Service將需要實施單獨的喚醒鎖定策略,以確保手機繼續運行,直到服務可用。「