2016-08-30 73 views
1

我正在研究一個涉及AlarmManager的應用程序,我似乎無法啓動它。我最初使用的是Handler,但是我切換到了AlarmManager,這樣我就可以將手機從睡夢中喚醒。AlarmManager不定時觸發

這是我到目前爲止有:

int timeBetweeninMillis = 3 * 60000;  
if (ManagerService.serviceRunning) { 
      Intent alarmIntent = new Intent(AlarmReceiver.ACTION_RECEIVE); 
      PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 400, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime() + timeBetweeninMillis), alarmPendingIntent); 
     } 

的AlarmManager要麼將不會觸發或極晚期(後像10分鐘),將閃光。

的應用程序是用與API 16和在手機上正在測試用API 19

謝謝您的幫助!

回答

0

回收現有PendingIntent可能會導致AlarmManager問題的新PendingIntent存在問題。

要解決的是,我總是添加一個獨特的價值,我所有的PendingIntent S,這一個班輪確實在大多數情況下,招:

Intent alarmIntent = new Intent(AlarmReceiver.ACTION_RECEIVE); 

alarmIntent.setData(Uri.parse("custom://" + System.currentTimeMillis())); // MAKE INTENT UNIQUE 

PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 400, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime() + timeBetweeninMillis), alarmPendingIntent); 

另外,我不知道是什麼在你的代碼是ManagerService.serviceRunning ,但我會添加一些日誌到其他情況,以確保您實際上正在運行該代碼塊。

編輯:

嘗試使用mAlarmManager.setExactAndAllowWhileIdle代替mAlarmManager.set這將迫使AlarmManager請求時,正好打電話給你的代碼,並防止設備空閒時間從與報警干擾。

請參見: https://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int, long, android.app.PendingIntent)

+0

這確實似乎沒有做任何事情。我的AlarmManager仍然沒有開火。我誤解了如何使用AlarmManager?在'timeBetweeninMillis'毫秒過去之後,我的印象是上面的代碼應該觸發。另外,ManagerService.serviceRunning不會阻止代碼的運行。 –

+0

看到我的編輯,可能是答案 – marmor

+0

有沒有辦法解決這個問題,而不使用'.setExactAndAllowWhileIdle'?該功能需要API 23,我正在使用API​​ 19 –