2013-04-23 30 views
18

Tôi đã xem xét tất cả các câu hỏi AUTO-CANCEL-not-working khác ở đây và tất cả dường như đều liên quan đến những sai lầm mà tôi không thực hiện. Tôi đã thử cả haiAndroid: Sử dụng AUTO-CANCEL trên thông báo khi ứng dụng của bạn đang chạy ở chế độ nền

builder.setAutoCancel(true); 

Notification notif = builder.build(); 
notif.flags |= Notification.FLAG_AUTO_CANCEL; 

Cả công trình.

Tôi đang sử dụng NotificationCompat vì API tối thiểu của tôi là 8. Đây là mã đầy đủ của tôi. Trong thông báo cụ thể này, tôi không gọi một ý định, vì tôi không cần người dùng làm bất cứ điều gì.

NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentTitle(getString(R.string.app_name) + ": my title"); 
builder.setContentText(message); 
builder.setSmallIcon(R.drawable.notification_icon); 

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.prog_icon); 
builder.setLargeIcon(bitmap); 

builder.setAutoCancel(true); // dismiss notification on user click 

NotificationManager notiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
notiManager.notify(MY_NOTI_MANAGER_ID, builder.build()); 

Thông báo chỉ hiển thị hoàn hảo. Bạn có thể vuốt để xóa nó. Nhưng chỉ cần nhấn vào nó sẽ không loại bỏ thông báo. Nó chỉ sáng lên và ở đó.

Một số khác biệt có thể có giữa mã của tôi và các mã khác được đăng tại đây: 1) Tôi đang sử dụng NotificationCompat (không nên tạo sự khác biệt, nhưng chúng tôi đã nghe trước đó). 2) Vì thông báo của tôi rất đơn giản, tôi không đính kèm ý định.

Vui lòng cho tôi biết nếu bạn có bất kỳ thông tin chi tiết nào.

Chỉnh sửa: Mục đích của tôi là loại bỏ thông báo mà không cần làm nền ứng dụng nền của tôi.

Trả lời

24

Vì vậy, rõ ràng là bạn làm cần một ý định chờ giải quyết.

Tại Android - notification manager, having a notification without an intent, tôi đã tìm thấy giải pháp lấy ứng dụng hiện hoạt làm mục đích đang chờ xử lý của bạn (để bạn không phải bắt đầu hoạt động của riêng mình để loại bỏ thông báo).

Tôi chỉ cần thêm hai dòng mã sau đây (ngay sau khi thiết lập các tính năng tự động hủy bỏ):

PendingIntent notifyPIntent = 
    PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0);  
builder.setContentIntent(notifyPIntent); 

Nó làm việc rất lớn. Tôi sẽ nói rằng nếu bạn không muốn hoạt động của mình khởi động lại do người dùng nhấp vào thông báo của bạn, thì đây là lựa chọn tốt nhất của bạn.

+0

Điều này đúng ... – superUser

+2

Giải pháp là tốt, tuy nhiên tôi nghĩ rằng lời giải thích là không chính xác. Nó không "lấy ứng dụng đang hoạt động hiện tại như mục đích đang chờ xử lý của bạn", nhiều khả năng nó sẽ gửi mục đích trống và thu gọn khay thông báo. Vì ý định không làm gì cả, nên chúng tôi rơi trở lại trên đỉnh của chồng hoạt động. –

+0

yep làm việc như nhà vô địch .. Cảm ơn rất nhiều .. –

6

Dường như bạn đang thiếu các cuộc gọi PendingIntentsetContentIntent(). Tôi tin rằng đó là cần thiết để tự động hủy bỏ để làm việc.

Dưới đây là một số Notification -displaying logic từ this sample project rằng hoạt động:

private void raiseNotification(Intent inbound, File output, Exception e) { 
    NotificationCompat.Builder b=new NotificationCompat.Builder(this); 

    b.setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL) 
    .setWhen(System.currentTimeMillis()); 

    if (e == null) { 
     b.setContentTitle(getString(R.string.download_complete)) 
     .setContentText(getString(R.string.fun)) 
     .setSmallIcon(android.R.drawable.stat_sys_download_done) 
     .setTicker(getString(R.string.download_complete)); 

     Intent outbound=new Intent(Intent.ACTION_VIEW); 

     outbound.setDataAndType(Uri.fromFile(output), inbound.getType()); 

     b.setContentIntent(PendingIntent.getActivity(this, 0, outbound, 0)); 
    } 
    else { 
     b.setContentTitle(getString(R.string.exception)) 
     .setContentText(e.getMessage()) 
     .setSmallIcon(android.R.drawable.stat_notify_error) 
     .setTicker(getString(R.string.exception)); 
    } 

    NotificationManager mgr= 
     (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

    mgr.notify(NOTIFY_ID, b.build()); 
    } 
+1

Cảm ơn bạn. Tôi cũng tìm thấy giải pháp này: PendingIntent notifyPendingIntent = PendingIntent.getActivity (getApplicationContext(), 0, new Intent(), 0); \t \t builder.setContentIntent (notifyPendingIntent); Giải pháp này đã được đăng tại đây: http: // stackoverflow.com/questions/7040742/android-notification-manager-have-a-notification-without-a-intent – BeccaP

4

Hai người bạn thân nếu bạn muốn hiển thị thông báo không thể hủy (không thể hủy cho người dùng) cho thời gian cụ thể và sau đó bạn cần xóa nó (như trình phát nhạc).

mNotificationBuilder .setSmallIcon(android.R.drawable.btn_plus); 
mNotificationBuilder .setContentTitle("My notification"); 
mNotificationBuilder .setContentText("Notificattion From service"); 
mNotificationBuilder .setLights(0xFF0000FF, 500, 500); 

Notification note = mNotificationBuilder.build(); 
note.flags = Notification.FLAG_ONGOING_EVENT; // For Non cancellable notification 
mNotificationManager.notify(NOTIFICATION_ID, note); 
Các vấn đề liên quan