Cách xóa thông báo trong Android


96

Có thể xóa thông báo theo chương trình không?

Tôi đã thử nó với NotificationManagernhưng nó không hoạt động. Có cách nào khác mà tôi có thể làm được không?


12
Có thể xóa thông báo của riêng bạn nhưng không phải bất cứ ai khác
Donal Rafferty

1
Có đồng ý với Donal về đoạn mã xem androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

Xem câu trả lời này để biết cách xóa các thông báo khác cho API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Câu trả lời:


227

Sử dụng mã sau để hủy Thông báo:

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

Trong mã này luôn có cùng một id được sử dụng cho các thông báo. Nếu bạn có các thông báo khác nhau cần được hủy, bạn phải lưu các id mà bạn đã sử dụng để tạo Thông báo.


9
Tôi không biết tại sao điều này không được ủng hộ nhiều hơn và được chọn làm câu trả lời. Đây là giải pháp tôi đang tìm kiếm. Cảm ơn!
loeschg

3
Id thông báo ở đây nên là gì?
Deepak

Điều này thực sự hiệu quả. Nhưng khi tôi hủy thông báo, tất cả các thông báo tiếp theo sẽ không hiển thị nội dung tin nhắn thông báo (mà tôi đã đặt bằng cách sử dụng setContentText) mặc dù tôi đã đặt mức độ ưu tiên thành 2. Có đề xuất nào không?
Iqbal

Không hoạt động nếu cờ thông báo được đặt là Notification.FLAG_NO_CLEAR
Anand Savjani

2
cho tất cả và nếu bạn không biết id nào, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

Từ: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Để xóa thông báo trên thanh trạng thái khi người dùng chọn thông báo đó từ cửa sổ Thông báo, hãy thêm cờ "FLAG_AUTO_CANCEL" vào đối tượng Thông báo của bạn. Bạn cũng có thể xóa thông báo theo cách thủ công với hủy (int), chuyển ID thông báo hoặc xóa tất cả Thông báo của bạn với hủyAll ().

Nhưng Donal nói đúng, bạn chỉ có thể xóa các thông báo mà bạn đã tạo.


11
Thao tác này sẽ không hủy Thông báo theo chương trình.
Janusz

4
không chắc Janusz đang nói về điều gì nhưng hủy bỏ (id) và hủy bỏ Tất cả () chắc chắn hoạt động
Andrew G

32

Vì không ai đã đăng câu trả lời mã cho điều này:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. và nếu bạn đã có cờ, bạn có thể HOẶC FLAG_AUTO_CANCEL như thế này:

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

4
Nó tốt hơn theo cách này:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak

Bất cứ ai có thể giải thích tại sao nó tốt hơn theo cách đó?
Giáo sư

@Prof Nó ít mã hơn cho cùng một mục đích và không ảnh hưởng đến hiệu suất.
Denny

1
@Denny Điều này giả định rằng cờ thông báo đầu tiên được xác định ở trên vì vậy nó là hai dòng thay vì một dòng
Giáo sư

20

Vui lòng thử phương pháp mặc định được cung cấp trong NotificationManager .

NotificationManager.cancelAll()để xóa tất cả thông báo. NotificationManager.cancel(notificationId)để xóa thông báo cụ thể.


1
Trong trường hợp bất kỳ ai gặp khó khăn trên NotificationManager không có cancelphương thức, cancelphương thức không phải là tĩnh, vì vậy bạn cần một ví dụ NotificationManagernhư thế này: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Sau đó, bạn có thể gọi notificationManager.cancel(notificationId);như Rohit Suthar được tham chiếu trong câu trả lời của anh ấy. notificationIdchỉ đơn giản là ID bạn truyền vàonotificationManager.notify(notificationId, mNotification)
Mira_Cole

8

Bắt đầu với API cấp 18 (Jellybean MR2), bạn có thể hủy các Thông báo không phải của riêng bạn thông qua 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 (true)

khi bạn nhấp vào thông báo, hãy mở hoạt động tương ứng và xóa thông báo khỏi thanh thông báo


4

Nếu bạn đang tạo Thông báo từ một Dịch vụ được khởi chạy ở nền trước bằng cách sử dụng

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Sau đó phát hành

notificationManager.cancel(NOTIFICATION_ID);

không kết thúc việc hủy Thông báo và thông báo vẫn xuất hiện trên thanh trạng thái. Trong trường hợp cụ thể này, bạn sẽ cần phát hành

stopForeground( true );

từ bên trong dịch vụ để đưa nó trở lại chế độ nền và đồng thời hủy các thông báo. Ngoài ra, bạn có thể đẩy nó vào nền mà không cần phải hủy thông báo và sau đó hủy thông báo.

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

3

Nếu bạn đang sử dụng NotificationCompat.Builder(một phần của android.support.v4) thì chỉ cần gọi phương thức đối tượng của nósetAutoCancel

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

Một số người đã báo cáo điều đó setAutoCancel()không hiệu quả với họ, vì vậy bạn cũng có thể thử theo cách này

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

Lưu ý rằng phương pháp getNotification()này đã không được chấp nhận !!!


Câu hỏi đặt ra là làm thế nào để xóa nó theo chương trình. setAutoCancel () xóa nó khi người dùng nhấp vào Thông báo. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Không rõ anh ta muốn gì. Tôi hiểu rằng anh ấy muốn xóa thông báo khi người dùng nhấp vào nó.
sandalone

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

điều này hoạt động nếu bạn đang sử dụng trình tạo thông báo ...



1

Trên thực tế, như đã trả lời trước khi bắt đầu với API Cấp 18, bạn có thể hủy Thông báo do các ứng dụng khác đăng tải khác với ứng dụng của bạn bằng cách sử dụng NotificationListenerService nhưng cách tiếp cận đó sẽ không còn hoạt động trên Lollipop nữa, đây là cách để loại bỏ thông báo bao gồm API Lillipop.

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

Tôi không thể tìm thấy phương pháp cancelNotificationđó là gì?
Denny

Nó là một phương pháp từ lớp NotificationListenerService, hãy kiểm tra các tài liệu chính thức developer.android.com/reference/android/service/notification/...
Alejandro Casanova

Làm thế nào tôi có thể sử dụng nó ngoài dịch vụ?
Denny

0

Tất cả các thông báo (ngay cả các thông báo ứng dụng khác) có thể bị xóa thông qua nghe 'NotificationListenerService' như đã đề cập trong NotificationListenerService Triển khai

Trong dịch vụ bạn phải gọi cancelAllNotifications().

Dịch vụ phải được kích hoạt cho ứng dụng của bạn thông qua:

'Ứng dụng và thông báo' -> 'Quyền truy cập ứng dụng đặc biệt' -> 'Quyền truy cập thông báo'.


0

mã này đã làm việc cho tôi:

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

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}

0

Tôi tin rằng GẦN NHẤTCẬP NHẬT nhất cho AndroidX và khả năng tương thích ngược. Cách tốt nhất để làm (Kotlin và Java) điều này nên được thực hiện như:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Hoặc để hủy tất cả các thông báo là:

NotificationManagerCompat.from(context).cancelAll()

Được tạo cho AndroidX hoặc Thư viện hỗ trợ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.