如何在Android中以编程方式从通知栏删除通知?


75

任何人都知道我们如何以编程方式从应用程序中删除通知,即使用Pending intent进行调用。

我曾经使用以下方法取消通知。

AlarmManager am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(Display.this, TwoAlarmService.class);
PendingIntent pi = PendingIntent.getBroadcast(Display.this, AlarmNumber, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pi);

但是问题是尚未从通知栏删除的已经触发的通知。

提前致谢...

在此处输入图片说明


您好,我不知道是否可以删除通知programaticaly,但是您可以使用肯定的新通知覆盖旧通知。如果满足您的要求,那么我可以在这里为您发布代码。PLZ回复
布里赫什·帕特尔

不,实际上我有两个不同的通知,并且我已经在取消通知。
Jayeshkumar Sojitra 2013年

Answers:


210

也许试试这个:

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

或者,您也可以执行以下操作来取消给定上下文中的所有通知:

notificationManager.cancelAll();

请参阅此文档链接:NotificationManager


7
我不明白这是if (Context.NOTIFICATION_SERVICE != null)因为这是一个String常量,并且永远不会为null。
tar 2014年

5
你是对的,这个测试没用,我不知道为什么我做了(删除):/
An-droid 2014年

@Matthieu它已经工作了4年... :)目前尚未检查。请在任何情况下均无法正常运作。
Jayeshkumar Sojitra,

@JayeshSojitra我只是好奇到底是哪个cancel(NOTIFICATION_ID)还是cancelAll()那个把戏。万一你的记忆回到那远,那没什么大不了的:)
Matthieu 18'Aug

1
@Matthieu就我而言,两者都起作用。如果要取消特定的通知,请使用cancel(NOTIFICATION_ID);如果要取消所有通知,请使用cancelAll()。
Jayeshkumar Sojitra,

4

通知保持可见,直到发生以下情况之一:

用户可以单独关闭通知,也可以使用“全部清除”(如果可以清除通知)关闭通知。用户单击通知,然后在创建通知时调用setAutoCancel()。您为特定的通知ID调用cancel()。此方法还删除正在进行的通知。您调用cancelAll(),它将删除先前发出的所有通知。如果使用setTimeoutAfter()创建通知时设置了超时,则系统会在经过指定的持续时间后取消通知。如果需要,您可以在指定的超时时间过去之前取消通知

public void cancelNotification() {

    String ns = NOTIFICATION_SERVICE;
    NotificationManager nMgr = (NotificationManager) getActivity().getApplicationContext().getSystemService(ns);
    nMgr.cancel(NOTIFICATION_ID);
}

3

可以通过侦听NotificationListenerService实施中提到的“ NotificationListenerService”来删除所有通知(甚至其他应用程序通知)

在服务中,您必须致电cancelAllNotifications()

必须通过“应用和通知”->“特殊应用访问”->“通知访问”为您的应用启用该服务。

添加到清单:

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:label="Test App" android:name="com.test.NotificationListenerEx" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

然后在代码中;

public class NotificationListenerEx extends NotificationListenerService {


public BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationListenerEx.this.cancelAllNotifications();
    }
};


@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    super.onNotificationPosted(sbn);
}

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
    super.onNotificationRemoved(sbn);
}

@Override
public IBinder onBind(Intent intent) {
    return super.onBind(intent);
}

@Override
public void onDestroy() {
    unregisterReceiver(broadcastReceiver);
    super.onDestroy();
}

@Override
public void onCreate() {
    super.onCreate();
    registerReceiver(broadcastReceiver, new IntentFilter("com.test.app"));
}

之后,使用广播接收器触发全部清除。

按照上面的代码触发广播使用;

getContext().sendBroadcast(new Intent("com.test.app"));

我不知道您为什么已经接受了stackoverflow.com/a/19268653/1404774这个答案。
Jayeshkumar Sojitra,

您是否有上述问题无法解决的特定情况?
Jayeshkumar Sojitra,

以上内容不适用于所有通知(所有“应用”通知)。那只会删除当前应用创建的通知。
萨曼莎

如何触发?发送哪个广播?能否请您也发布如何触发它?
阿德里安·伊瓦斯库

按照上面的代码将是; getContext()。sendBroadcast(new Intent(“ com.test.app”);
萨曼莎(Samantha

2

我相信最近期最新的做事方式(科特林和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.