如何清除Android中的通知


96

是否可以通过程序清除通知?

我尝试了使用,NotificationManager但无法正常工作。我还有其他方法可以做到吗?


12
可以清除您自己的通知,但不能清除其他人的通知
Donal Rafferty 2010年

1
是与多纳尔达成一致的代码见androidtrainningcenter.blogspot.in/2013/04/...
Tofeeq艾哈迈德

请参阅此答案,以清除API> = 18的其他通知-stackoverflow.com/a/25693210/1073832
Jim Vitek

Answers:


227

使用以下代码取消通知:

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

在此代码中,始终有用于通知的相同ID。如果您有其他需要取消的通知,则必须保存用于创建通知的ID。


9
我不知道为什么不对此多加评论并选择答案。这是我一直在寻找的解决方案。谢谢!
loeschg 2013年

3
此处的通知ID应该是什么?
Deepak

这确实有效。但是,一旦取消通知,setContentText尽管将优先级设置为2 ,所有后续通知都不会显示通知消息文本(使用设置)。有什么建议吗?
Iqbal

如果将通知标志设置为Notification.FLAG_NO_CLEAR
无法

2
对于所有内容,如果您不知道哪个ID,则if(notificationManager!= null){notificationManager.cancelAll(); }
mehmet

42

来自:http : //developer.android.com/guide/topics/ui/notifiers/notifications.html

要在用户从“通知”窗口中选择状态栏通知时清除它,请将“ FLAG_AUTO_CANCEL”标志添加到通知对象。您也可以使用cancel(int)手动清除它,将通知ID传递给它,或者使用cancelAll()清除所有通知。

但是Donal是正确的,您只能清除您创建的通知。


11
这不会以编程方式取消通知。
Janusz 2012年

4
不确定Janusz在说什么,但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出于相同目的的代码更少,并且对性能没有影响。
丹尼

1
@Denny这假设第一通知标志的上方,从而它的两行而不是一行中所定义
教授

20

请尝试使用NotificationManager中提供的默认方法。

NotificationManager.cancelAll()删除所有通知。 NotificationManager.cancel(notificationId)删除特定的通知。


1
如果任何人都陷入没有cancel方法的NotificationManager上,则该cancel方法不是静态的,因此您需要一个这样的实例NotificationManagerNotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);然后,您可以notificationManager.cancel(notificationId);像在他的答案中引用的Rohit Suthar那样进行调用。notificationId只是您传递给的IDnotificationManager.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/...
小号菲茨

@SFitz这个问题不清楚他想要什么。我了解他想在用户单击通知时清除通知。
sandalone 2015年

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或支持库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.