2015-10-21 12 views
7

Używam Menedżera alarmów w usłudze uruchamianej co minutę.AlarmManager nie działa zgodnie z oczekiwaniami w trybie uśpienia na 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); 

Na Samsung S5 Neo: Kiedy ekran jest aktywny, to działa zgodnie z oczekiwaniami. Gdy ekran jest wyłączony, uruchamiany jest co 5 minut (zamiast jednego).

Próbuję dokładnie tego samego kodu na S5 Mini (z Androidem 4.4), Nexus 5 5.1 i Nexus 5 6.0, ten kod działa poprawnie.

targetSdkVersion jest 19.

Każdy pomysł, jak utrzymać AlarmManager działa poprawnie, gdy ekran jest wyłączony? Opóźnienie trwa nadal 5 minut, nawet jeśli poproszę o 30 sekund.

EDYCJA: Próbowałem również metody "setExact", ale nic nie zmieniło. Nadal ma 5 minut przerwy między każdym alarmem.

+0

Myślałem Dodałbym trochę informacji do potwierdzenia odpowiedzi poniżej: https://developer.android.com/training/monitoring-device-state/doze-standby.html#restrictions –

Odpowiedz

10

Powinieneś raczej użyć

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

zamiast

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

Take a look

od Google:

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

Uwaga: Początek API 19, czas wyzwalania przekazywane do tej metody jest traktowany jako niedokładny: alarm nie zostanie dostarczona przed upływem tego czasu, ale może być odroczone, a wydana jakiś czas później. System operacyjny użyje tych zasad, aby "grupować" alarmy w całym systemie, minimalizując liczbę razy, kiedy urządzenie musi się "obudzić" i minimalizując zużycie baterii. Zasadniczo alarmy zaplanowane w najbliższej przyszłości nie zostaną odroczone, o ile alarmy zaplanowane są daleko w przyszłości.

Edit:

czego używam dla aplikacji alarm:

Oczywisty:

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

kod Java:

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

Próbowałem już metody 'setExact', ale nic to nie zmieniło: wciąż 5 minut, aby poczekać . Zmienię moje pytanie, aby było bardziej precyzyjne. –

+0

@MathieuH. Czy możesz wysłać pozwolenie z manifestu i która wersja Androida to także S5 Neo? – Neige

+0

Używam wielu uprawnień, w tym Android.permission.WAKE_LOCK. Wersja Androida S5 Neo to 5.1.1. –