是否可以以编程方式清除通知?
我用NotificationManager
尝试了它,但它不起作用。
还有其他方法吗?
答案 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.Builder
(android.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);