Диспетчер аварийных сигналов | неправильно срабатывает при обновлении времени

Я экспериментирую с использованием Alarm Manager для повторного уведомления.

У меня есть действие, которое открывается с помощью средства выбора времени, и пользователь может либо выбрать время по умолчанию для приложения, либо выбрать время и установить уведомление. После этого запускается следующий код для установки триггера тревоги.

        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.

  1. Уведомление срабатывает, как ожидалось

  2. Теперь, в течение нескольких минут, если я захожу в приложение и устанавливаю время уведомления на 20:00

  3. Я получаю уведомление немедленно (т.е. как только я изменяю время на 20:00 и сохраняю время уведомления). Журналы «Получено широковещание» и «Уведомление запущено» также регистрируются в разделе LogCat.

Что могло быть причиной такого поведения? Как мне избежать этого неожиданного уведомления, но вместо этого вызвать его только в обновленное время.

Я пытался отменить AlarmManager каждый раз, когда обновлялось время уведомления. Все еще не работает, как ожидалось.

[Обновление 1]: я удалил приложение и снова запустил его. Как только я установил время и сохранил уведомление, я сразу получил уведомление приложения. (Время было установлено на 15 часов вперед от текущего времени)

0
0
21
1

Ответы 1

Вы можете легко исправить это, отключив сигнал тревоги. Напишите время последней обработки будильника в общих предпочтениях. Когда вы проснетесь, проверьте это предпочтение. Если осталось меньше суток, вернитесь и не обрабатывайте этот сигнал тревоги.

Это решение не работает. В установленное время не было инициировано никаких тревожных событий.

Navaneeth 15.09.2018 15:00

Другие вопросы по теме