2016-08-30 6 views
1

Ich arbeite an einer App, die einen AlarmManager beinhaltet, und ich kann es nicht scheinen zu schießen. Ich benutzte ursprünglich einen Handler, aber ich wechselte zum AlarmManager, damit ich das Telefon aus dem Schlaf aufwecken konnte.AlarmManager nicht regelmäßig feuern

Hier ist, was ich bisher:

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); 
     } 

Der Alarmmanager entweder nicht extrem spät Feuer oder Feuer wird (wie 10 Minuten nach).

Die App ist mit API 16 geschrieben und 19.

Sie mit API auf einem Telefon getestet wird für Ihre Hilfe danken!

Antwort

0

Es gibt ein Problem mit neuen PendingIntent s recycling bestehenden PendingIntent s, die Probleme mit AlarmManager verursachen könnten.

dass Umgehung, habe ich immer einen eindeutigen Wert an alle meine PendingIntent s hinzufügen, diese Einzeiler den Trick in den meisten Fällen tut:

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); 

Auch ich weiß nicht, was ManagerService.serviceRunning in Ihrem Code ist , aber ich würde einige Logs in den else-Fall einfügen, um sicherzustellen, dass Sie diesen Codeblock tatsächlich ausführen.

EDIT:

Versuchen Sie es mit mAlarmManager.setExactAndAllowWhileIdle statt mAlarmManager.set dieser wird Alarmmanager zwingen Sie den Code genau zu rufen, wenn gewünscht, und Gerät Leerlaufzeit verhindern mit dem Alarm stört.

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

+0

Das hat nicht wirklich etwas zu tun scheinen. Mein AlarmManager feuert immer noch nicht. Verkenne ich, wie man den AlarmManager benutzt? Ich hatte den Eindruck, dass der obige Code ausgelöst werden sollte, nachdem 'timeBetweeninMillis' Millisekunden vergangen sind. Außerdem verhindert ManagerService.serviceRunning nicht, dass der Code ausgeführt wird. –

+0

sehe meine Bearbeitung, könnte die Antwort sein – marmor

+0

Gibt es eine Möglichkeit, das zu beheben, ohne '.setExactAndAllowWhileIdle' zu ​​verwenden? Diese Funktion benötigt API 23 und ich verwende API 19 –