Вы должны изменить свой код на:
PendingIntent pi=PendingIntent.getBroadcast(context,0,myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
}
@Edit Приведенный выше код будет работать в течение установленного времени. Но в этом разделе будет рассказано о повторении для менеджера тревог.
Для API ниже 19 мы используем AlarmManager.setRepeating()
, чтобы периодически срабатывать будильники точно в указанное время. Но с версии 19 и новее этот метод больше не будет работать, и API не поддерживает такое поведение. Я думаю, что это изменение API заставляет разработчиков думать более тщательно, когда они создают таймер. Потому что запуск таймера в точное время периодически сильно разряжает батарею.
Если вы хотите, вы должны сделать это самостоятельно. Во-первых, вы устанавливаете AlarmManager.setExact()
, и при срабатывании будильника вы снова сработаете в следующий раз вручную.
Вот код:
PendingIntent pi=PendingIntent.getBroadcast(context,0,myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager. setExact(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
} else {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
}
И в вашем намерении, где вы помещаете код дескриптора, вы должны проверить, если android api> = 19, приложение создаст новый сигнал тревоги для следующего события.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
doSomething();
// calculate time for next event
Calendar nextEvent = calcNextEvent();
// and set alarm again
alarmManager. setExact(AlarmManager.RTC_WAKEUP, nextEvent.getTimeInMillis(), pi);
} else {
doSomething();
}
Я думаю, что это проблема в дизайне Android API. Старый код должен работать в новой версии. В любом случае, этот новый дизайн API делает все понятнее для разработчика, лучше для системы (экономия заряда батареи). Конечно, при использовании нового API :)
Надеюсь, это поможет :)
person
hqt
schedule
04.01.2015
Note: Beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use.
- person Phantômaxx   schedule 04.01.2015