Alarmmanager не отменяется после нажатия на уведомление

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

Мое приложение отправляет два уведомления каждые "х" в разные минуты. У меня есть кнопка для запуска службы и еще одна для ее остановки. Когда я запускаю службу, уведомления запускаются, и когда я нажимаю кнопку остановки, она работает правильно. Но когда я запускаю службу и выхожу из приложения, уведомления запускаются нормально, но когда я нажимаю на уведомление, приложение открывается, а затем я нажимаю кнопку "Стоп", но уведомления никогда не прекращаются, уведомления продолжают срабатывать.

Функция, в которой я вызываю alarmanager.cancel(pendingintent), находится в том же фрагменте.. (MainFragment.class, который является первым фрагментом).

MainFragment.class

    intent = new Intent(getContext(), TimeAlarm.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    intent.setAction(Long.toString(System.currentTimeMillis()));
    pendingIntent = PendingIntent.getBroadcast(mContext, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + 15000,
                15000,
                pendingIntent);

    intent2 = new Intent(getContext(), TimeAlarm2.class);
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    intent2.setAction(Long.toString(System.currentTimeMillis()));
    pendingIntent2 = PendingIntent.getBroadcast(getContext(), 1,
            intent2, PendingIntent.FLAG_UPDATE_CURRENT);

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime() + 15000,
                        15000,
                        pendingIntent2);

TimeAlarm.class, который расширяет BroadcastReceiver

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.icon)
                .setContentTitle("...")
                .setContentText("...");

 Intent resultIntent = new Intent(context, MainActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);

        mBuilder.setAutoCancel(true);

        mBuilder.build().flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT;

        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());

TimeAlarm2.class, который расширяет BroadcastReceiver

NotificationCompat.Builder mBuilder2 = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.icon2)
                .setContentTitle("..")
                .setContentText("..");

        Intent resultIntent = new Intent(context, MainActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(1, PendingIntent.FLAG_UPDATE_CURRENT);

        mBuilder2.setContentIntent(resultPendingIntent);

        mBuilder2.setAutoCancel(true);

        mBuilder2.build().flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder2.build());

Спасибо и всего наилучшего!

3 ответа

Решение

Удалите эти строки из обоих намерений и попробуйте снова.

intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
intent2.setAction(Long.toString(System.currentTimeMillis()));

Это работает для меня

Попробуйте это, и если ошибка говорит мне, что происходит.

Для этого вам нужно уничтожить сервис по кнопке Стоп и снова запустить сервис по нажатию кнопки Старт.

Хорошо. Я могу предложить вам позвонить cancel() в AlarmManager с PendingIntent, эквивалентным тому, который вы использовали с setRepeating() метод.

Здесь вы можете отменить оба ваших эквивалентных pendingIntent.

am.cancel(pendingIntent);

а также

am.cancel(pendingIntent2);

Надеюсь, это поможет вам.

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