Как очистить уведомление в Android


97

Можно ли программно очистить уведомление?

Я пробовал это с, NotificationManagerно не работает. Есть ли другой способ сделать это?


12
Можно очистить свои собственные уведомления, но не чужие,
Донал Рафферти,

1
Да, согласитесь с Доналом, чтобы увидеть фрагмент кода, см. Androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

См. Этот ответ, чтобы узнать, как удалить другие уведомления для API> = 18 - stackoverflow.com/a/25693210/1073832
Джим Витек

Ответы:


227

Используйте следующий код, чтобы отменить уведомление:

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);

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


9
Я не знаю, почему за это больше не проголосовали и не выбрали в качестве ответа. Это было решение, которое я искал. Спасибо!
loeschg

3
Какой здесь должен быть идентификатор уведомления?
Deepak

Это действительно работает. Но как только я отменяю уведомление, все последующие уведомления не показывают текст сообщения уведомления (который я установил с помощью setContentText), хотя я установил приоритет на 2. Есть предложения?
Iqbal

Не работает, если флаг уведомления установлен как Notification.FLAG_NO_CLEAR
Ананд Савджани

2
для всех, и если вы не знаете, какой идентификатор, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

От: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Чтобы очистить уведомление строки состояния, когда пользователь выбирает его из окна уведомлений, добавьте флаг «FLAG_AUTO_CANCEL» в свой объект уведомления. Вы также можете очистить его вручную с помощью cancel (int), передав ему идентификатор уведомления, или очистить все свои уведомления с помощью cancelAll ().

Но Донал прав, очистить можно только созданные вами уведомления.


11
Это не приведет к отмене уведомления программно.
Януш

4
не уверен, о чем говорит Януш, но cancel (id) и cancelAll () определенно работают
Andrew G

32

Поскольку никто не опубликовал код ответа на это:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. и если у вас уже есть флаги, вы можете ИЛИ FLAG_AUTO_CANCEL вот так:

notification.flags = Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL;

4
Так лучше:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Себастьян Новак

Может ли кто-нибудь объяснить, почему так лучше?
Prof

@Prof Это меньше кода для той же цели и не влияет на производительность.
Денни

1
@Denny Предполагается, что первый флаг уведомления определен выше, поэтому это две строки вместо одной
Prof

21

Попробуйте использовать метод по умолчанию, указанный в NotificationManager .

NotificationManager.cancelAll()чтобы удалить все уведомления. NotificationManager.cancel(notificationId)чтобы удалить конкретное уведомление.


1
В случае, если кто-то застрял в NotificationManager, не имеющем cancelметода, cancelметод не является статическим, поэтому вам понадобится экземпляр, NotificationManagerподобный этому: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Затем вы можете позвонить, notificationManager.cancel(notificationId);как Рохит Сутар, упомянутый в его ответе. notificationIdэто просто идентификатор, в который вы notificationManager.notify(notificationId, mNotification)
ввели

8

Начиная с уровня API 18 (Jellybean MR2), вы можете отменить уведомления, отличные от ваших, через NotificationListenerService.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class MyNotificationListenerService extends NotificationListenerService {...}

...

private void clearNotificationExample(StatusBarNotification sbn) {
    myNotificationListenerService.cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}

5
 Notification mNotification = new Notification.Builder(this)

                .setContentTitle("A message from: " + fromUser)
                .setContentText(msg)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.app_icon)
                .setContentIntent(pIntent)
                .build();

.setAutoCancel (истина)

когда вы нажимаете на уведомление, откройте соответствующее действие и удалите уведомление из панели уведомлений


4

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

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Затем выдавая

notificationManager.cancel(NOTIFICATION_ID);

не отменяет уведомление, и оно по-прежнему отображается в строке состояния. В этом конкретном случае вам нужно будет выдать

stopForeground( true );

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

stopForeground( false );
notificationManager.cancel(NOTIFICATION_ID);

3

Если вы используете NotificationCompat.Builder(часть android.support.v4), просто вызовите метод его объектаsetAutoCancel

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);

Некоторые ребята сообщали, что setAutoCancel()у них не получилось, так что вы можете попробовать и этот способ.

builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;

Обратите внимание, что этот метод getNotification()устарел !!!


Вопрос задан как программно очистить. setAutoCancel () очищает его, когда пользователь нажимает на уведомление. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Из вопроса непонятно, чего он хочет. Я понял, что он хочет очистить уведомление, когда пользователь нажимает на него.
sandalone 05

1
    // Get a notification builder that's compatible with platform versions
    // >= 4
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            this);
    builder.setSound(soundUri);
    builder.setAutoCancel(true);

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



1

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

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}

Я не могу найти способ, cancelNotificationчто это?
Денни

Это метод из класса NotificationListenerService, пожалуйста, проверьте официальную документацию developer.android.com/reference/android/service/notification/…
Алехандро Казанова

Как я могу использовать его вне службы?
Денни

0

Все уведомления (даже уведомления других приложений) могут быть удалены путем прослушивания «NotificationListenerService», как указано в реализации NotificationListenerService.

В сервис надо звонить cancelAllNotifications().

Служба должна быть включена для вашего приложения через:

«Приложения и уведомления» -> «Доступ к специальным приложениям» -> «Доступ к уведомлениям».


0

этот код работал у меня:

public class ExampleReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}

0

Я считаю САМЫМ ПОСЛЕДНИМ и ОБНОВЛЕННЫМ для AndroidX и обратной совместимости. Лучший способ сделать это (Kotlin и Java) - это сделать так:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Или отменить все уведомления:

NotificationManagerCompat.from(context).cancelAll()

Сделано для AndroidX или библиотек поддержки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.