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);
Надеюсь, это поможет вам.