NotificationManager.cancel (id) не работает внутри широковещательного приемника

Android: Я пытаюсь отменить уведомление из панели уведомлений после установки пакета. Я делаю следующее:

public class MyBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "MyBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { Uri data = intent.getData(); //some code goes here //get the id of the notification to cancel in some way notificationhelper._completeNotificationManager.cancel(id); } } } 

где

 public class notificationhelper { public static NotificationManager _completeNotificationManager = null; public void complete() { if (_completeNotificationManager == null) _completeNotificationManager = (NotificationManager) _context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification( R.drawable.notification, _context.getString(R.string.notification), System.currentTimeMillis()); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.flags |= Notification.FLAG_NO_CLEAR; _completeNotificationManager.notify(TEXT, id, notification); } } 

Но notificationhelper._completeNotificationManager.cancel(id) не работает. Я попытался использовать notificationhelper._completeNotificationManager.cancelAll(); И это работает. Что я делаю неправильно?

Solutions Collecting From Web of "NotificationManager.cancel (id) не работает внутри широковещательного приемника"

По моему опыту, вы не можете отменить все уведомления с определенным идентификатором, независимо от тега.

То есть, если вы создадите два уведомления, например:

 notificationManager.notify(TAG_ONE, SAME_ID, notification_one); notificationManager.notify(TAG_TWO, SAME_ID, notification_two); 

Тогда notificationManager.cancel(SAME_ID) не отменяет ни одно из них! Я подозреваю, что это потому, что поле «тег», если не указано в notify () и cancel (), по умолчанию имеет значение null, которое вы должны явно отменить.

Таким образом, чтобы отменить эти два уведомления, вы должны позвонить:

 notificationManager.cancel(TAG_ONE, SAME_ID); notificationManager.cancel(TAG_TWO, SAME_ID); 

В вашем случае вы отправляете «ТЕКСТ» в качестве тега, но отменяете только использование id, по умолчанию используется tag = null.

Таким образом, либо не предоставляйте ТЕКСТ в качестве тэга:

 _completeNotificationManager.notify(id, notification); 

Или, если вам нужны отдельные уведомления и вы не хотите, чтобы они сливались друг с другом, отслеживайте активные теги:

 _completeNotificationManager.notify(TEXT, id, notification); collectionOfActiveTags.add(TEXT); ... for (String activeTag : collectionOfActiveTags) notificationhelper._completeNotificationManager.cancel(activeTag, id); 

Мне жаль, что то, что вы пытаетесь сделать, было поддержано, так как кажется, что это должно быть.

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

Если NotificationManager.cancel() не работает, попробуйте изменить идентификатор для уведомления.

 notificationManager.notify(NOTIFICATION_ID, notification); 

Когда я изменил NOTIFICATION_ID с 1 на [RANDOM_NUMBER], он волшебным образом начал работать. Я предполагаю, что 1 как-то зарезервирован, хотя в любой документации нет заметки …

Конечно, убедитесь, что вы используете тот же NOTIFICATION_ID для отмены:

 notificationManager.cancel(NOTIFICATION_ID); 

Недавно я столкнулся с той же проблемой. Мне удалось это решить.

Так из того, что я понял.

1) используйте идентификатор, который является в основном случайным числом для уведомления и отправки этого же идентификатора на кусок кода (приемник / активность …), где вы хотите его отменить.

2) При использовании тегов, похоже, это не работает для меня, поскольку я давал один тег всем уведомлениям, но с уникальным идентификатором. Он работал только с первым тегом. Поэтому я полностью избегал использовать теги. Если вы хотите использовать теги, выдавайте уникальные теги вместе с уникальным идентификатором и используйте их при отмене.

Итак, окончательный ответ … что я использовал и что работает для меня:

 STEP 1: int notif_id = (int)(System.currentTimeMillis()%10000); STEP2: add this id inside the action intent (I am launching an activity where the notification gets cancelled on the action click): Intent notificationSettingsIntent = new Intent(context.getApplicationContext(), NotificationSettingsActivity.class); notificationSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); notificationSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); notificationSettingsIntent.putExtra("fromNotification",true); notificationSettingsIntent.putExtra("notif_id",notif_id); PendingIntent notificationSettingsActivityPendingIntent = PendingIntent.getActivity(context,notif_id,notificationSettingsIntent,PendingIntent.FLAG_ONE_SHOT); STEP 3: notify using the id in the step 1 but with no tags NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext()); notificationCompat.notify(notif_id,notificationBuilder.build()); 

Теперь в Activity, который открывается моим действием, нажмите, я отмените уведомление как:

 NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext()); notificationCompat.cancel(getIntent().getIntExtra("notif_id")); 

Работает каждый раз сейчас.