2017-05-31 3 views
1

Ich versuche einen AlarmManager alle 3 Minuten laufen zu lassen, aber er läuft zu falschen und unterschiedlichen Zeiten, Momente in Sekunden und andere laufen nicht. Ich versuche auf einem Android 7.0 und einem anderen 6.0-Gerät zu testen und beide laufen falsch, ich sah die folgenden Kommentare, konnte aber nicht beheben.AlarmManager läuft zur falschen Zeit

Alarm Manager Example AlarmManager fires alarms at wrong time Android AlarmManager fire at wrong time

den folgenden Code:

long repeatTime = 180000; 

     AlarmManager processTimer = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intentAlarm = new Intent(context, TimerProcessReceiver.class); 
     PendingIntent pendingIntentAlarm = PendingIntent.getBroadcast(context, 0, 
       intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 

     if (android.os.Build.VERSION.SDK_INT < 19) { 
      processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
        repeatTime, pendingIntentAlarm); 
     } else { 
      processTimer.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 
        repeatTime, pendingIntentAlarm); 
     } 

immer noch Probleme habe ich, wie oben aktualisiert. Update als @ Vyacheslav Antwort

long repeatTime = 180000 + System.currentTimeMillis(); 
    AlarmManager processTimer = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intentAlarm = new Intent(context, ProcessReceiver.class); 
    PendingIntent pendingIntentAlarm = PendingIntent.getBroadcast(context, 0, 
      intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 

    int currentapiVersion = Build.VERSION.SDK_INT; 

    if (Build.VERSION.SDK_INT >= 23) { 
     processTimer.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 
       repeatTime, pendingIntentAlarm); 

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 

      processTimer.setExact(AlarmManager.RTC_WAKEUP, 
        repeatTime, pendingIntentAlarm); 

    } else if (currentapiVersion < Build.VERSION_CODES.KITKAT) { 

     processTimer.set(AlarmManager.RTC_WAKEUP, repeatTime, 
       pendingIntentAlarm); 

    } 

Falls ich bin mit zwei gleichzeitigen Timer mit dem PendingIntent von ids 0 und 1 (aber die Struktur der Zugabe dieser PendingIntent sind die gleiche wie der Code oben), aber mit der gleichen Laufzeit 3 Minuten. Beide führen den falschen Weg in ein paar Sekunden und zufällig.

+0

versuchen diese System.currentTimeMillis einzuloggen() + REPEAT und überprüfen Zeit hier https://www.epochconverter.com/ – xbadal

+0

TimerProcessReceiver.class Paste – xbadal

+0

auch> versuchen, diese https : //stackoverflow.com/questions/44204387/alarmmanager-setinexactrepeating-setwindow-setrepeating-methods-do-not-fire-al/44205413#44205413 –

Antwort

0

Verwenden Sie stattdessen setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation). Es hilft, Ihr Gerät zu wecken.

EDIT

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT){ 
      am.set(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } else { 
      if (currentapiVersion < android.os.Build.VERSION_CODES.M) { 
       am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi); 
      } else { 
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 
      } 
     } 
+0

Die setRepeating und setExact, die für Geräte unterhalb der API-Ebene 23 funktionieren würden? Wenn ich diese Geräte auf Stufe 23 teste, werde ich auch auf niedrigeren Ebenen testen. Entschuldige mich für den Fehler. – user6505882

+0

@ user6505882 Ich benutze dies: siehe aktualisierte Antwort. – Vyacheslav

+0

Immer noch Probleme, habe ich wie oben aktualisiert. – user6505882

Verwandte Themen