Как убрать уведомление в Android

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

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

17 ответов

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

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

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

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

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

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

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

notification.flags = Notification.FLAG_AUTO_CANCEL;

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

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

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

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

Начиная с уровня 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());
}
 Notification mNotification = new Notification.Builder(this)

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

.setAutoCancel(правда)

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

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

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Потом выдача

notificationManager.cancel(NOTIFICATION_ID);

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

stopForeground( true );

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

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

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

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

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

NotificationManagerCompat.from(context).cancelAll()

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

Если вы используете 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() устарела!!!

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

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

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

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}
   String ns = Context.NOTIFICATION_SERVICE;
  NotificationManager Nmang = (NotificationManager) getApplicationContext()
                                                     .getSystemService(ns);
  Nmang .cancel(getIntent().getExtras().getInt("notificationID"));

для получения дополнительной ссылки нажмите здесь http://androiddhina.blogspot.in/2015/01/how-to-clear-notification-in-android.html

Функция, написанная на Котлине:

/**
 * Delete the notification
 */
fun delete(context: Context, notificationId: Int) =
    with(NotificationManagerCompat.from(context)) {
        cancel(notificationId)
    }

Или проще:

fun delete(context: Context, notificationId: Int) = NotificationManagerCompat.from(context).cancel(notificationId)

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

В сервис вам нужно позвонить cancelAllNotifications(),

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

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

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

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

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

Чтобы удалить уведомления в Oreo и более поздних версиях

      //Create Notification
     Notification.Builder builder = new Notification.Builder(this, NOTIFICATION_CHANNEL_ID)
                        .setContentTitle(getString(R.string.app_name))
                        .setAutoCancel(true);
    
                Notification notification = builder.build();
                NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                createNotificationChannel(builder, notificationManager);
                mNotificationManager=notificationManager;
                startForeground(1, notification);


    //Remove notification
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    mNotificationManager.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);
                }

Если вы используете OneSignal, вы должны использовать одно из следующего:

Конкретное уведомление:

      OneSignal.removeNotification(mutableNotification.androidNotificationId)

Все уведомления:

      OneSignal.clearOneSignalNotifications()

В Java-документе OneSignal говорится:

Для removeNotification

      Cancels a single OneSignal notification based on its Android notification integer ID. Use
* instead of Android's {@link NotificationManager#cancel(int)}, otherwise the notification will be restored
* when your app is restarted.

Для clearOneSignalNotifications

      If you just use
* {@link NotificationManager#cancelAll()}, OneSignal notifications will be restored when
* your app is restarted.
Другие вопросы по тегам