Android'de bir bildirim nasıl temizlenir


99

Bir bildirimi programatik olarak temizlemek mümkün müdür?

İle denedim NotificationManagerama çalışmıyor. Bunu yapmamın başka bir yolu var mı?


12
Kendi bildirimlerinizi temizlemeniz mümkün ama başkasının değil
Donal Rafferty

1
Evet, Donal ile kod parçası için katılıyorum, bkz. Androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

API için diğer bildirimleri temizlemenin bir yolu için bu yanıta bakın> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Yanıtlar:


228

Bir Bildirimi iptal etmek için aşağıdaki kodu kullanın:

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

Bu kodda her zaman bildirimler için kullanılan aynı kimlik vardır. İptal edilmesi gereken farklı bildirimleriniz varsa, Bildirimi oluşturmak için kullandığınız kimlikleri kaydetmeniz gerekir.


9
Bunun neden daha fazla oylanmadığını ve yanıt olarak seçilmediğini bilmiyorum. Aradığım çözüm buydu. Teşekkürler!
loeschg

3
Buradaki bildirim kimliği ne olmalıdır?
Deepak

Bu gerçekten işe yarıyor. Ancak bir bildirimi iptal setContentTextettiğimde, önceliği 2'ye ayarlamama rağmen sonraki tüm bildirimler bildirim mesajı metnini (kullanmayı ayarladığım ) göstermiyor. Herhangi bir öneriniz var mı?
Iqbal

Bildirim bayrağı Bildirim olarak ayarlanmışsa çalışmıyor.FLAG_NO_CLEAR
Anand Savjani

2
herkes için ve hangi kimliği bilmiyorsanız, eğer (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

Gönderen: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Kullanıcı Bildirimler penceresinden bunu seçtiğinde durum çubuğu bildirimini temizlemek için Bildirim nesnenize "FLAG_AUTO_CANCEL" bayrağını ekleyin. Ayrıca cancel (int) ile manuel olarak temizleyebilir, bildirim kimliğini iletebilir veya cancelAll () ile tüm Bildirimlerinizi temizleyebilirsiniz.

Ancak Donal haklı, yalnızca kendi oluşturduğunuz bildirimleri temizleyebilirsiniz.


11
Bu, bir Bildirimi programlı olarak iptal etmez.
Janusz

4
emin Janusz bahsediyor fakat iptal (id) ve kesinlikle iş cancelAll () ne
Andrew G

32

Kimse buna bir kod cevabı göndermediğinden:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. ve zaten işaretleriniz varsa, bunu VEYA FLAG_AUTO_CANCEL yapabilirsiniz:

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

4
Böylesi daha iyi:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak

Biri neden böylesi daha iyi olduğunu açıklayabilir mi?
Prof

@Prof Aynı amaç için daha az koddur ve performans üzerinde hiçbir etkisi yoktur.
Denny

1
@Denny Bu, ilk bildirim bayrağının yukarıda tanımlandığını varsayar, bu nedenle tek satır yerine iki satırdır
Prof

22

Lütfen NotificationManager'da sağlanan varsayılan yöntemi deneyin .

NotificationManager.cancelAll()tüm bildirimleri kaldırmak için. NotificationManager.cancel(notificationId)belirli bildirimi kaldırmak için.


1
NotificationManager'da bir cancelyönteme sahip olmayan birinin takılıp kalması durumunda, cancelyöntem statik değildir, bu yüzden NotificationManagerbunun gibi bir örneğe ihtiyacınız var : NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);O zaman, notificationManager.cancel(notificationId);cevabında referans gösterilen Rohit Suthar gibi çağrı yapabilirsiniz . notificationIdbasitçe girdiğiniz kimliktirnotificationManager.notify(notificationId, mNotification)
Mira_Cole

8

API seviyesi 18'den (Jellybean MR2) başlayarak, NotificationListenerService aracılığıyla kendi bildiriminiz dışındaki Bildirimleri iptal edebilirsiniz.

@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 (doğru)

bildirime tıkladığınızda, ilgili etkinliği açın ve bildirim çubuğundan bildirimi kaldırın


4

Eğer NotificationCompat.Builder(bir parçası android.support.v4) kullanıyorsanız , basitçe nesnesinin yöntemini çağırınsetAutoCancel

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

Bazıları setAutoCancel()kendileri için işe yaramadığını bildirdi , bu yüzden siz de bu yolu deneyebilirsiniz

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

Not yöntem getNotification()kullanımdan kaldırıldı !!!


Soru, programlı olarak nasıl temizleneceğini sordu. setAutoCancel (), kullanıcı Bildirime tıkladığında bunu temizler. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Ne istediği sorusundan belli değil. Bir kullanıcı tıkladığında bildirimi temizlemek istediğini anladım.
sandalone

4

Kullanarak ön planda başlatılan bir Hizmetten Bildirim oluşturuyorsanız

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Sonra veren

notificationManager.cancel(NOTIFICATION_ID);

Bildirimi iptal etmez ve bildirim hala durum çubuğunda görünür. Bu özel durumda, yayınlamanız gerekecek

stopForeground( true );

arka plan moduna geri döndürmek ve aynı anda bildirimleri iptal etmek için hizmetin içinden. Alternatif olarak, bildirimi iptal ettirmeden arka plana itebilir ve ardından bildirimi iptal edebilirsiniz.

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

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

bu, bir bildirim oluşturucu kullanıyorsanız çalışır ...


2

AndroidX ve geriye dönük uyumluluk için en SON ve GÜNCELLENEN olduğuna inanıyorum . Bunu yapmanın en iyi yolu (Kotlin ve Java) şu şekilde yapılmalıdır:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Veya tüm bildirimleri iptal etmek için:

NotificationManagerCompat.from(context).cancelAll()

AndroidX veya Destek Kitaplıkları için yapılmıştır.


1

Aslında API Seviye 18 ile başlamadan önce yanıtlandığı gibi, NotificationListenerService kullanarak diğer uygulamaların gönderdiği Bildirimleri iptal edebilirsiniz, ancak bu yaklaşım artık Lollipop'ta çalışmayacaktır, Lillipop API'sini de kapsayan bildirimleri kaldırmanın yolu işte burada.

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

Yöntemi bulamıyorum cancelNotificationnedir?
Denny

NotificationListenerService sınıfından bir yöntemdir, lütfen resmi dokümantasyon geliştiricisini
Alejandro Casanova

Hizmetin dışında nasıl kullanabilirim?
Denny

1
   String ns = Context.NOTIFICATION_SERVICE;
  NotificationManager Nmang = (NotificationManager) getApplicationContext()
                                                     .getSystemService(ns);
  Nmang .cancel(getIntent().getExtras().getInt("notificationID"));

0

NotificationListenerService Implementation'da belirtildiği gibi tüm bildirimler (diğer uygulama bildirimleri bile) 'NotificationListenerService' dinleyerek kaldırılabilir.

Serviste aramanız gerekir cancelAllNotifications().

Hizmet, uygulamanız için şu şekilde etkinleştirilmelidir:

'Uygulamalar ve bildirimler' -> 'Özel uygulama erişimi' -> 'Bildirim erişimi'.


0

bu kod benim için çalıştı:

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

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.