У меня есть приложение с будильником, в котором есть функция одновременной установки ежедневных будильников (часы и минуты).
Итак, для этого я планирую повторяющееся событие, которое должно происходить каждый час, чтобы убедиться, что следующий будильник сработает в этот день.
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, BootBroadcastReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 9998, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
Calendar.getInstance().getTimeInMillis() + 5000,
AlarmManager.INTERVAL_HOUR, alarmIntent);
} else {
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
Calendar.getInstance().getTimeInMillis() + 5000,
AlarmManager.INTERVAL_HOUR, alarmIntent);
}
А внутри класса BootBroadcastReceiver я запускаю JobIntentService, который обеспечивает работу следующего аварийного сигнала и проверил логику его правильной работы на большинстве устройств.
Это часть, где я устанавливаю реальные сигналы тревоги внутри JobIntentService.
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
} else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
} else {
alarmMgr.set(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
}
Однако на одном из устройств, на котором установлено мое приложение, не было звонка будильника в назначенное время, это произошло через 3 недели после установки моего приложения на это устройство!
Итак, у меня есть 3 вопроса:
1- Является ли моя общая логика лучшим способом справиться с ежедневной тревогой или есть лучший подход?
2- Устройство, сообщившее о проблеме, не вызывающей сигнал тревоги, является Android KitKat (v4.4), может ли мой код иметь недостатки с версией KitKat?
3-Как вы знаете, когда вы перезапускаете устройство, вещательный приемник, который вы установили с помощью alarmmanger, срабатывает, даже если это было не то время, которое вы запланировали, поэтому, чтобы избежать срабатывания будильника в неправильное время, я проверяю текущие часы и минут, и сравните его с кэшированными значениями тревоги внутри класса приемника широковещания, запускаемого менеджером тревоги.
Так может ли трансляция не быть запущена в точные минуты? и поэтому моя логика проверки минут отклоняет сигнал тревоги?
например, если я поставлю будильник на 12:30, может ли трансляция сработать в 12:29 или 12:31?
Затем я проверяю текущие минуты и часы и нахожу текущие минуты 29 или 31 вместо 30, поэтому аварийные сигналы не работают?
Вот мой чек внутри приемника вещания:
Calendar alarmCalendar = Calendar.getInstance();
alarmCalendar.setTimeInMillis(alarmTimeStamp);
int alarmMinutes = alarmCalendar.get(Calendar.MINUTE);
int alarmHour = alarmCalendar.get(Calendar.HOUR_OF_DAY);
Calendar nowCalendar = Calendar.getInstance();
int nowMinutes = nowCalendar.get(Calendar.MINUTE);
int nowHour = nowCalendar.get(Calendar.HOUR_OF_DAY);
if (nowHour != alarmHour || nowMinutes != alarmMinutes)
return;