2015-10-21 7 views
7

Ich verwende einen AlarmManager in einem Service, der jede Minute ausgelöst wird.AlarmManager funktioniert nicht wie erwartet im Sleep-Modus auf S5 Neo

PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, 
      getUpdateServiceIntent(mContext), PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

    // Cancel any pending Intent 
    am.cancel(pendingIntent); 

    // Set a new one 
    am.set(AlarmManager.RTC_WAKEUP, 60000, pendingIntent); 

Auf der Samsung S5 Neo: Wenn der Bildschirm aktiv ist, wird es wie erwartet funktioniert. Wenn der Bildschirm ausgeschaltet ist, wird er alle 5 Minuten (statt einer) ausgelöst.

Ich versuche diesen genau gleichen Code auf S5 Mini (mit Android 4.4), Nexus 5 5.1 und Nexus 5 6.0, dieser Code funktioniert gut.

targetSdkVersion ist 19.

Jede Idee, wie die Alarmmanager zu halten richtig funktioniert, wenn der Bildschirm ausgeschaltet ist? Die Verzögerung beträgt immer noch 5 Minuten, auch wenn ich 30 Sekunden lang frage.

EDIT: Ich habe auch versucht, die 'setExact' Methode, aber es hat nichts geändert. Zwischen den einzelnen Weckzeiten muss immer noch ein Intervall von 5 Minuten liegen.

+0

Ich dachte, ich würde hinzufügen einige Informationen zur Bestätigung Antworten unten: https://developer.android.com/training/monitoring-device-state/doze-standby.html#restrictions –

Antwort

10

Sie sollten wahrscheinlich

AlarmManager#setExact(int type, long triggerAtMillis, PendingIntent operation)

statt

AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))

Take a look

von Google verwenden:

AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))

Hinweis: Beginnend in API 19 wird die Triggerzeit, die an diese Methode weitergegeben wird, als ungenau behandelt: Der Alarm wird nicht vor dieser Zeit geliefert, kann jedoch verzögert und einige Zeit später geliefert werden. Das Betriebssystem wird diese Richtlinie verwenden, um Alarme über das gesamte System zu "stapeln", wodurch die Anzahl der Male minimiert wird, die das Gerät "aufwachen" muss und der Batterieverbrauch minimiert wird. Im Allgemeinen werden Alarme, die in naher Zukunft geplant werden, nicht zurückgestellt, solange Alarme weit in der Zukunft geplant sind.

Edit:

Was ich für einen Alarm Anwendung bin mit:

Manifest:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

Java-Code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(nextAlarm.getTimeInMillis(), pendingIntent); 
    alarmManager.setAlarmClock(alarmClockInfo, pendingIntent); 
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    alarmManager.setExact(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent); 
}else { 
    alarmManager.set(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent); 
} 
+1

Ich habe bereits versucht, die 'setExact' Methode, aber es hat nichts geändert: noch 5 Minuten warten . Ich werde meine Frage präzisieren. –

+0

@MathieuH. Kannst du die Erlaubnis aus dem Manifest veröffentlichen und welche Version von Android ist auch der S5 Neo? – Neige

+0

Ich benutze viele Erlaubnis, einschließlich android.permission.WAKE_LOCK. S5 Neo Android-Version ist 5.1.1. –