Я экспериментирую с использованием диспетчера тревог для повторного уведомления.
У меня есть действие, которое открывается с помощью средства выбора времени, и пользователь может либо выбрать время по умолчанию для приложения, либо выбрать время и настроить уведомление.После этого запускается следующий код для установки триггера тревоги.
notificationTime = new Session(context).getNotificationTime();
if(notificationTime == null){
// Set App default time (16:30)
notificationTime = new NotificationTime();
}
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, notificationTime.hours);
calendar.set(Calendar.MINUTE, notificationTime.minutes);
calendar.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, NotificationReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
if(Build.VERSION.SDK_INT < 19){
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}else{
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
Триггер тревоги вызывает NotificationReceiver BrodcastReceiver, где я генерирую уведомление
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder;
String name = "Reminder";
String id = "Reminder"; // The user-visible name of the channel.
String description = "Reminder"; // The user-visible description of the channel.
Intent repeatingIntent = new Intent(context, RepeatingActivity.class);
repeatingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 100, repeatingIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Log.d("My Log", "Broadcast Received");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = notificationManager.getNotificationChannel(id);
if (mChannel == null) {
mChannel = new NotificationChannel(id, name, importance);
mChannel.setDescription(description);
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(mChannel);
}
builder = new NotificationCompat.Builder(context, id);
builder.setContentTitle("Custom Alarm") // required
.setSmallIcon(android.R.drawable.ic_popup_reminder) // required
.setContentText("Reminder") // required
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setTicker("Custom Alarm")
.setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
}else{
builder = new NotificationCompat.Builder(context);
builder.setContentTitle("Custom Alarm") // required
.setSmallIcon(android.R.drawable.ic_popup_reminder) // required
.setContentText("Reminder") // required
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setTicker("Custom Alarm")
.setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
.setPriority(Notification.PRIORITY_HIGH);
}
Log.d("My Log", "Notification Triggered");
Notification notification = builder.build();
notificationManager.notify(100, notification);
Эта установка работает отлично, за исключениемследующий сценарий: 1. Допустим, я установил уведомление для запуска в 13:00
Уведомление срабатывает, как и ожидалось
Теперь через несколько минут, если я зайду в приложение и установлю время уведомления, скажем, 20: 00
Я получаю уведомление немедленно (т.е. как только я изменяю время на 20:00 и сохраняю время уведомления).Журналы «Broadcast Received» и «Notification Triggered» также регистрируются в разделе LogCat.
Что может быть причиной такого поведения?Как мне избежать этого неожиданного уведомления, но вместо этого вызвать его только в обновленное время.
Я пытался отменить AlarmManager каждый раз, когда обновляется время уведомления.Все еще не работает должным образом.
[Обновление 1]: я удалил приложение и снова запустил его.Как только я установил время и сохранил уведомление, я сразу получил уведомление от приложения.(Время было установлено на 15 часов вперед от текущего времени)