2017-07-07 2 views
2

Es ist ein Code, der eine Aktion zu einem bestimmten Zeitpunkt genau mit dem AlarmManager (am nächsten Tag um 7.00 Uhr) auslösen soll:Alarmmanager würde das Telefon nicht aufwachen

val manager = getSystemService(Context.ALARM_SERVICE) as AlarmManager 
val intent = Intent(this, FooIntentService::class.java) 
val pendingIntent = PendingIntent.getService(this, 0, intent, 0) 

// Set alarm 
val calendar = Calendar.getInstance() 
calendar.timeInMillis = System.currentTimeMillis() 
calendar.set(Calendar.HOUR_OF_DAY, 7) 
calendar.set(Calendar.MINUTE, 0) 

// Set tomorrow 
calendar.add(Calendar.DATE, 1) 

manager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent) 

ich diese getestet haben Code, um das Ereignis in bis zu 5 Minuten auszulösen, die App zu schließen (alle Apps zu schließen) und sie in den Ruhezustand zu versetzen (Drücken der Hold-Taste) - und es funktioniert. Aber wenn ich die Zeit für morgen um 7:00 Uhr einstelle (was weit mehr als 5 Minuten von jetzt an ist) - würde es niemals auslösen, bis ich es entsperrt habe (manuell aufgewacht). Im Moment wachte ich auf - die Aktion hat sofort ausgelöst.


Frage: ist der Beispielcode habe ich für die Einstellung geplante Veranstaltung in meinem Fall korrekt zur Verfügung gestellt?

+2

Vielleicht dösen: https://stackoverflow.com/questions/35629268/alarm-manager-issue-in-android-6-0-doze-mode – Alex

+0

@ Alex Danke für das Teilen, das könnte die Antworten. Ich werde untersuchen und das Ergebnis in diesem Thread bereitstellen. – Oleg

+1

Werfen Sie einen Blick auf den 2. Teil der folgenden Antwort: https://Stackoverflow.com/a/39739886/3363481 – earthw0rmjim

Antwort

2

Hinweis: Beginnend mit API 19 (KITKAT) ist die Alarmzustellung ungenau: Das Betriebssystem schaltet Alarme um, um das Aufwecken und den Batterieverbrauch zu minimieren. Es gibt neue APIs zur Unterstützung von Anwendungen, die strenge Liefergarantien benötigen. Siehe setWindow (int, long, long, PendingIntent) und setExact (int, long, PendingIntent). Anwendungen, deren targetSdkVersion älter als API 19 ist, sehen weiterhin das vorherige Verhalten, bei dem alle Alarme genau dann geliefert werden, wenn sie angefordert werden.

Von documentation

Grundsätzlich wird der Alarm soll Wakeups und Batteriebetrieb nicht exakt zu minimieren. Sie können set durch setExact ersetzen, dann sollte es funktionieren, wie Sie benötigten.

manager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent); 
Verwandte Themen