如何在Android中清除通知

时间:2010-04-19 06:49:27

标签: android notifications

是否可以以编程方式清除通知?

我用NotificationManager尝试了它,但它不起作用。 还有其他方法吗?

17 个答案:

答案 0 :(得分:216)

使用以下代码取消通知:

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

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

答案 1 :(得分:41)

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

  

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

但是Donal是对的,你只能清除你创建的通知。

答案 2 :(得分:32)

由于没有人发布代码答案:

notification.flags = Notification.FLAG_AUTO_CANCEL;

..如果你已经有了旗帜,你可以这样做OR FLAG_AUTO_CANCEL:

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

答案 3 :(得分:15)

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

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

答案 4 :(得分: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 :(得分:4)

 Notification mNotification = new Notification.Builder(this)

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

<强> .setAutoCancel(真)

当您点击通知时,打开相应的活动并从通知栏中删除通知

答案 6 :(得分:3)

如果您使用NotificationCompat.Builderandroid.support.v4的一部分),则只需调用其对象的方法setAutoCancel

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

有些人报告说setAutoCancel()对他们不起作用,所以你也可以尝试这种方式

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

请注意方法getNotification()已被弃用 !!!

答案 7 :(得分:3)

我相信,AndroidX和向后兼容性最最近已更新。最好的执行方式(Kotlin和Java)应通过以下方式完成:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

或者取消所有通知是:

NotificationManagerCompat.from(context).cancelAll()

适用于AndroidX或支持库。

答案 8 :(得分: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);

如果您使用通知构建器,则此方法有效...

答案 9 :(得分:1)

   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

答案 10 :(得分:1)

实际上,在启动API级别18之前,您可以取消其他应用程序发布的通知,而不是您自己使用NotificationListenerService,但该方法将不再适用于Lollipop,这是删除Lillipop API通知的方法。

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

答案 11 :(得分:0)

清除奥利奥及更高版本的通知

//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);
                }

答案 12 :(得分:0)

如果您使用 OneSignal,则必须使用以下之一:

具体通知:

OneSignal.removeNotification(mutableNotification.androidNotificationId)

所有通知:

OneSignal.clearOneSignalNotifications()

在 OneSignal 的 java 文档中说:

对于删除通知

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.

答案 13 :(得分:0)

Kotlin 编写的功能:

/**
 * 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)

答案 14 :(得分: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);
  }
}

答案 15 :(得分:0)

可以通过听NotificationListenerService Implementation

中提到的“ NotificationListenerService”来删除所有通知(甚至是其他应用程序通知)

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

必须通过以下方式为您的应用程序启用服务:

“应用和通知”->“特殊应用访问”->“通知访问”。

答案 16 :(得分:0)

如果要使用

从前台启动的服务生成通知
startForeground(NOTIFICATION_ID, notificationBuilder.build());

然后发出

notificationManager.cancel(NOTIFICATION_ID);

最终不会取消通知,通知仍会显示在状态栏中。在这种特殊情况下,您需要发出

stopForeground( true );

从服务中将其重新置于后台模式并同时取消通知。或者,您可以将其推送到后台而不取消通知,然后取消通知。

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