วิธีล้างการแจ้งเตือนใน Android


99

เป็นไปได้ไหมที่จะล้างการแจ้งเตือนโดยใช้โปรแกรม

ฉันลองแล้วNotificationManagerแต่มันใช้งานไม่ได้ มีวิธีอื่นที่ฉันสามารถทำได้หรือไม่?


12
เป็นไปได้ที่จะล้างการแจ้งเตือนของคุณเอง แต่ไม่ใช่ของใคร
Donal Rafferty

1
ใช่เห็นด้วยกับ Donal สำหรับชิ้นส่วนของรหัสโปรดดูandroidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

ดูคำตอบนี้สำหรับวิธีล้างการแจ้งเตือนอื่น ๆ สำหรับ API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

คำตอบ:


228

ใช้รหัสต่อไปนี้เพื่อยกเลิกการแจ้งเตือน:

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

ในรหัสนี้จะมีรหัสเดียวกับที่ใช้สำหรับการแจ้งเตือน หากคุณมีการแจ้งเตือนอื่นที่จำเป็นต้องยกเลิกคุณจะต้องบันทึกรหัสที่คุณใช้ในการสร้างการแจ้งเตือน


9
ฉันไม่รู้ว่าทำไมถึงไม่โหวตเพิ่มและเลือกเป็นคำตอบ นี่คือทางออกที่ฉันกำลังมองหา ขอบคุณ!
loeschg

3
รหัสการแจ้งเตือนที่นี่ควรเป็นอย่างไร
Deepak

นี่ใช้งานได้จริง แต่เมื่อฉันยกเลิกการแจ้งเตือนการแจ้งเตือนที่ตามมาทั้งหมดจะไม่แสดงข้อความแจ้งเตือน (ซึ่งฉันตั้งค่าโดยใช้setContentText) แม้ว่าฉันจะตั้งค่าลำดับความสำคัญเป็น 2 ข้อเสนอแนะใด ๆ
Iqbal

ไม่ทำงานหากตั้งค่าสถานะการแจ้งเตือนเป็น Notification.FLAG_NO_CLEAR
Anand Savjani

2
สำหรับทุกคนและถ้าคุณไม่รู้ว่า id ใดถ้า (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

จาก: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

หากต้องการล้างการแจ้งเตือนแถบสถานะเมื่อผู้ใช้เลือกจากหน้าต่างการแจ้งเตือนให้เพิ่มแฟล็ก "FLAG_AUTO_CANCEL" ในออบเจ็กต์การแจ้งเตือนของคุณ คุณยังสามารถล้างด้วยตนเองด้วยการยกเลิก (int) ส่งรหัสการแจ้งเตือนหรือล้างการแจ้งเตือนทั้งหมดของคุณด้วยการยกเลิกทั้งหมด ()

แต่ Donal พูดถูกคุณสามารถล้างการแจ้งเตือนที่คุณสร้างขึ้นเท่านั้น


11
การดำเนินการนี้จะไม่ยกเลิกการแจ้งเตือนตามโปรแกรม
Janusz

4
ไม่แน่ใจว่า Janusz พูดถึงอะไร แต่ยกเลิก (id) และยกเลิกทั้งหมด () ได้ผลแน่นอน
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;
Sebastian Nowak

ใครช่วยอธิบายได้ว่าทำไมถึงดีกว่านั้น?

@Prof เป็นรหัสที่น้อยกว่าสำหรับวัตถุประสงค์เดียวกันและไม่มีผลกระทบต่อประสิทธิภาพการทำงาน
Denny

1
@Denny นี่ถือว่าธงการแจ้งเตือนครั้งแรกถูกกำหนดไว้ด้านบนดังนั้นจึงเป็นสองบรรทัดแทนที่จะเป็นบรรทัดเดียว

22

โปรดลองวิธีการเริ่มต้นประกอบไปด้วยNotificationManager

NotificationManager.cancelAll()เพื่อลบการแจ้งเตือนทั้งหมด NotificationManager.cancel(notificationId)เพื่อลบการแจ้งเตือนเฉพาะ


1
ในกรณีที่มีใครติดขัดใน NotificationManager ที่ไม่มีcancelเมธอดcancelวิธีนี้จะไม่คงที่ดังนั้นคุณต้องมีอินสแตนซ์NotificationManagerเช่นนี้: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);จากนั้นคุณสามารถโทรหาnotificationManager.cancel(notificationId);Rohit Suthar ที่อ้างถึงในคำตอบของเขา notificationIdเป็นเพียง ID ที่คุณส่งผ่านnotificationManager.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 (จริง)

เมื่อคุณคลิกที่การแจ้งเตือนเปิดกิจกรรมที่เกี่ยวข้องและลบการแจ้งเตือนออกจากแถบการแจ้งเตือน


4

หากคุณใช้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/…
S Fitz

@SFitz มันไม่ชัดเจนจากคำถามว่าเขาต้องการอะไร ฉันเข้าใจว่าเขาต้องการล้างการแจ้งเตือนเมื่อผู้ใช้คลิก
รองเท้าแตะ

4

หากคุณกำลังสร้างการแจ้งเตือนจากบริการที่เริ่มต้นในส่วนหน้าโดยใช้

startForeground(NOTIFICATION_ID, notificationBuilder.build());

แล้วออก

notificationManager.cancel(NOTIFICATION_ID);

ไม่สิ้นสุดการยกเลิกการแจ้งเตือนและการแจ้งเตือนยังคงปรากฏในแถบสถานะ ในกรณีนี้คุณจะต้องออก

stopForeground( true );

จากภายในบริการเพื่อนำกลับเข้าสู่โหมดพื้นหลังและเพื่อยกเลิกการแจ้งเตือนพร้อมกัน อีกวิธีหนึ่งคือคุณสามารถดันเข้าไปในพื้นหลังได้โดยไม่ต้องยกเลิกการแจ้งเตือนแล้วยกเลิกการแจ้งเตือน

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

ใช้งานได้ถ้าคุณใช้ตัวสร้างการแจ้งเตือน ...


2

ฉันเชื่อว่าล่าสุดและอัปเดตที่สุดสำหรับ AndroidX และความเข้ากันได้รุ่นเก่า วิธีที่ดีที่สุดในการทำ (Kotlin และ Java) ควรทำดังนี้:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

หรือจะยกเลิกการแจ้งเตือนทั้งหมดคือ:

NotificationManagerCompat.from(context).cancelAll()

สร้างขึ้นสำหรับ AndroidX หรือไลบรารีสนับสนุน


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คืออะไร?
Denny

เป็นวิธีการจากคลาส NotificationListenerService โปรดตรวจสอบเอกสารอย่างเป็นทางการdeveloper.android.com/reference/android/service/notification/…
Alejandro Casanova

ฉันจะใช้มันนอกบริการได้อย่างไร?
Denny

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

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);
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.