6

Tôi đã cố gắng trong nhiều giờ để loại bỏ một thông báo dai dẳng thiết lập bởi một dịch vụ sử dụng:NotificationManager.cancel() không làm việc cho tôi

startForeground(1337, notification); 

Mã Tôi đang sử dụng để hủy bỏ nó:

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
nManager.cancel(1337); // cancel existing service notification, doesn't take effect 
nManager.cancelAll(); //surpluous, but also doesn't take effect 

Tôi thiếu gì ở đây? Tôi bối rối.

Để làm rõ lý do tại sao tôi làm điều này: Dịch vụ bắt đầu bằng Thông báo liên tục mặc định. Khi ứng dụng của tôi chạy, ứng dụng cần thay thế Thông báo này bằng một thông báo khác. Tuy nhiên, việc sử dụng notify() trên Thông báo hiện có hoàn toàn hoạt động, tuy nhiên, tôi cũng cần nó để hiển thị văn bản mã cho Thông báo mới. Đây là lý do tôi quyết định xóa Thông báo hiện tại (sử dụng mã ở trên), tạo một thông báo mới, sau đó tôi gọi lại startForeground() và chuyển Thông báo mới đến đó, vì vậy Dịch vụ của tôi vẫn tồn tại.

+0

Bạn đang cố xóa thông báo được bắt đầu từ ứng dụng khác? – matt5784

+0

không, đó là cùng một ứng dụng – slinden77

Trả lời

11

Vấn đề là bạn đang phát hành Thông báo theo cách gián tiếp bằng cách sử dụng startForeground(). Bạn không thể chỉ hủy Thông báo đó vì lý do tương tự mà hệ thống khẳng định bạn cung cấp Thông báo khi bắt đầu Dịch vụ nền trước. Miễn là dịch vụ tiền cảnh của bạn đang chạy, thông báo đó sẽ có ở đó.

Trong hầu hết các trường hợp, Dịch vụ thực sự không nên ở nền trước. Nếu bạn có thể sử dụng mức ưu tiên thông thường cho Dịch vụ của mình, thì bạn có thể bắt đầu và ngừng Thông báo của mình bình thường.

Nếu bạn đang thực sự làm điều gì đó thực sự yêu cầu dịch vụ nền trước và nếu bạn thực sự muốn hiển thị cho người dùng một văn bản đánh dấu, tôi tin rằng tùy chọn duy nhất của bạn là phát hành một Thông báo khác.

+7

họ thực sự nên đặt điều này trong tài liệu hoặc có nó ném một lỗi khi điều này là cố gắng ... – slinden77

6

Bạn luôn có thể xóa thông báo khỏi dịch vụ nền trước bằng callng stopForeground (boolean removeNotification). Sau đó, một dịch vụ thoát khỏi foregroundState của mình và một lần nữa có thể bị hệ thống giết khi cần bộ nhớ.

0

Bạn có thể cập nhật thông báo bằng cách chuyển vào Trình tạo trống.

if(showNotification){ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setVisibility(Notification.VISIBILITY_SECRET) 
      .setSmallIcon(R.mipmap.ic_spotify_white_24dp) 
      .setTicker("Playing Now") 
      .setContentTitle("Spotify") 
      .setContentText("Preview"); 
    return mBuilder; 
}else{ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
    return mBuilder; 
} 
Các vấn đề liên quan