2

Я создаю будильник. Для того, чтобы установить дату и время, я использую AlarmManager:Создать будильник на android lollipop

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
PendingIntent pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
        am.set(AlarmManager.RTC_WAKEUP, note.getAlarmTime(), pi); 

В моей BroadcastReceiver в методе onReceive я начинаю новую деятельность (ее как диалог с информацией и воспроизведения музыки) и для разблокировки экрана:

PowerManager pm; 
PowerManager.WakeLock wakeLock; 
KeyguardManager.KeyguardLock myLock; 

KeyguardManager myKeyGuard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    isLocked = myKeyGuard.inKeyguardRestrictedInputMode(); 

myLock = myKeyGuard.newKeyguardLock(KEYGUARD_SERVICE); 

    if (isLocked) { 
     myLock.disableKeyguard(); 
    } 

    pm = (PowerManager) getApplicationContext() 
      .getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
      | PowerManager.ACQUIRE_CAUSES_WAKEUP 
      | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
    wakeLock.acquire(); 

Все это работает отлично, но на устройствах Lollipop я заметил, что будильник не всегда срабатывает, особенно когда устройство было заблокировано более 20 минут. Что бы это могло быть? Может быть, какая-то функция, которая сбрасывает указанное время, или мне нужен другой метод, чтобы разблокировать экран программно на Android-Lollipop?

ответ

2

Из Android 19 вы должны использовать новый метод AlarmManager.setExact(), если хотите, чтобы ваш код был точным, а не AlarmManager.set(). Об этом говорится в AlarmManager API documentation:

Примечание: Начиная с API 19 (KITKAT) доставка сигнала тревоги неточна: операционная система будет смещаться сигналы для того, чтобы свести к минимуму пробуждений и использование батареи. Существуют новые API-интерфейсы для поддержки приложений, требующих строгих гарантий доставки; см. setWindow (int, long, long, PendingIntent) и setExact (int, long, PendingIntent). Приложения, чья targetSdkVersion ранее, чем API 19, будут продолжать видеть предыдущее поведение, при котором все аварийные сигналы доставляются точно по запросу.

+0

Спасибо, сейчас тестирование. –

 Смежные вопросы

  • Нет связанных вопросов^_^