Як очистити сповіщення в Android


96

Чи можливо очистити сповіщення програмно?

Я спробував це з, NotificationManagerале це не працює. Чи є інший спосіб, я можу це зробити?


12
Очистити свої сповіщення можна, але не будь-хто інший
Donal Rafferty

1
Так, згоден з Donal на шматок коду, див. 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
Який тут повинен бути ідентифікатор сповіщення?
Діпак

Це справді працює. Але як тільки я скасовую сповіщення, усі наступні сповіщення не показують текст повідомлення (який я встановив, використовуючи setContentText), хоча я визначаю пріоритет 2. Будь-які пропозиції?
Ікбал

Не працює, якщо прапор сповіщення встановлено як Повідомлення.FLAG_NO_CLEAR
Anand Savjani

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

42

Від: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Щоб очистити сповіщення в рядку стану, коли користувач вибирає його у вікні сповіщень, додайте прапор «FLAG_AUTO_CANCEL» до об’єкта сповіщень. Ви також можете очистити його вручну, скасувавши (int), передавши йому ідентифікатор сповіщення або очистити всі свої сповіщення за допомогою cancelAll ().

Але Donal вірно, ви можете очистити лише створені вами сповіщення.


11
Це не скасує Повідомлення програмно.
Януш

4
не впевнений, про що говорить Януш, але скасувати (ідентифікатор) та скасуватиВсі () обов'язково спрацюють
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 Це менше код для тієї ж мети і не впливає на продуктивність.
Денні

1
@Denny Це передбачає, що перший прапор сповіщення визначений вище, тож це два рядки замість одного рядка
Проф.

20

Спробуйте метод за замовчуванням, наданий у 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)
Mira_Cole

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 (true)

натиснувши на сповіщення, відкрийте відповідну діяльність та видаліть сповіщення з панелі сповіщень


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 З питання не зрозуміло, чого він хоче. Я зрозумів, що він хоче очистити сповіщення, коли користувач натисне на нього.
сандалон

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, ось спосіб видалення сповіщень, що охоплюють також API Lillipop.

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

Я не можу знайти метод, cancelNotificationщо це?
Денні

Це метод з класу NotificationListenerService, будь ласка, перевірте офіційну розробку
Алехандро Казанова

Як я можу використовувати його поза службою?
Денні

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 і зворотної сумісності. Найкращий спосіб (Котлін та Ява) це слід робити так:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Або скасувати всі сповіщення:

NotificationManagerCompat.from(context).cancelAll()

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.