2012-09-29 25 views
24

Tôi muốn cập nhật dữ liệu thông báo, nhưng cách duy nhất tôi tìm thấy là khởi chạy một ID mới có cùng Id.Có thể kiểm tra xem thông báo có hiển thị hoặc bị hủy không?

Vấn đề là tôi không muốn nâng cấp mới nếu bản gốc đã bị hủy. Có cách nào để thông báo liệu có hiển thị hoặc hủy thông báo không? Hoặc một cách để cập nhật thông báo chỉ khi nó tồn tại?

Trả lời

29

Đây là cách tôi giải quyết nó:

private boolean isNotificationVisible() { 
    Intent notificationIntent = new Intent(context, MainActivity.class); 
    PendingIntent test = PendingIntent.getActivity(context, MY_ID, notificationIntent, PendingIntent.FLAG_NO_CREATE); 
    return test != null; 
} 

Đây là cách tôi tạo ra thông báo:

/** 
* Issues a notification to inform the user that server has sent a message. 
*/ 
private void generateNotification(String text) { 

    int icon = R.drawable.notifiaction_icon; 
    long when = System.currentTimeMillis(); 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification notification = new Notification(icon, text, when); 
    String title = context.getString(R.string.app_name); 
    Intent notificationIntent = new Intent(context, MainActivity.class); 

    // set intent so it does not start a new activity 
    //notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent intent = PendingIntent.getActivity(context, MY_ID, notificationIntent, 0); 
    notification.setLatestEventInfo(context, title, text, intent); 

    notification.flags |= Notification.FLAG_AUTO_CANCEL; //PendingIntent.FLAG_ONE_SHOT 

    notificationManager.notify(MY_ID, notification); 
} 
+0

phải có điều gì đó sai. khi tôi viết trong phương thức '' 'onResume()' '' '' 'if (isNotificationVisible())' '' thông báo của tôi nên bị hủy bỏ với: '' '((NotificationManager) getSystemService (NOTIFICATION_SERVICE)). MY_ID); '' 'và sau đó' '' kết thúc(); startActivity (getIntent()); '' 'Tôi nhận được một vòng lặp dẫn đến khởi động lại điện thoại của tôi. vì vậy phương pháp này nên được xử lý cẩn thận .... – maysi

+5

Không làm việc cho tôi. Điều này luôn luôn trở lại đúng với tôi. – Saket

+1

Đã không hoạt động đối với tôi trong Android 4.3. 'PendingIntent' bị kẹt lại sau khi tôi loại bỏ thông báo, và thậm chí sau khi tôi đã giết toàn bộ ứng dụng. Chỉ khởi động lại điện thoại đã loại bỏ nó. Ngoài ra, 'setLatestEventInfo()' không còn tồn tại, vì vậy tôi chỉ sử dụng 'setContentIntent()' để thay thế. – Sam

1

Tôi nghĩ bạn có thể sử dụng deleteIntent của lớp Notification.

Tôi nhớ một trong các ứng dụng của mình tôi sử dụng để kích hoạt Broadcast (phát sóng tùy chỉnh) khi thông báo bị hủy hoặc khay Thông báo đã bị xóa.

1

Một thay thế cho các deleteIntent là sau đó đã chứng minh có lợi trong ứng dụng của riêng tôi:

Về cơ bản, bạn tạo ý định với thông báo bắt đầu IntentService (hoặc bất kỳ dịch vụ nào khác) và trong onHandleIntent bạn có thể đặt một lá cờ cho biết liệu thông báo có đang hoạt động hay không.
Bạn có thể đặt mục đích này được kích hoạt khi người dùng nhấn vào thông báo (contentIntent) và/hoặc khi người dùng xóa nó khỏi danh sách (deleteIntent).

Để minh họa, đây là những gì tôi làm trong ứng dụng của riêng tôi. Khi xây dựng thông báo tôi đặt

Intent intent = new Intent(this, CleanupIntentService.class); 
Notification n = NotificationCompat.Builder(context).setContentIntent(
     PendingIntent.getActivity(this, 0, intent, 0)).build(); 

khi thông báo được khai thác, CleanupIntentService của tôi được đưa ra, thiết lập một lá cờ (trong dịch vụ đã tạo ra thông báo):

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onCreate(); // If removed, onHandleIntent is not called 
    return super.onStartCommand(intent, flags, startId); 
} 


@Override 
protected void onHandleIntent(Intent intent) { 
    OtherService.setNotificationFlag(false); 
} 
6

Salam. Nếu bạn đang sử dụng API >= 23 có thể sử dụng phương pháp này để nhận thông báo hoạt động:

StatusBarNotification[] notifications = mNotificationManager.getActiveNotifications(); 
for (StatusBarNotification notification : notifications) { 
    if (notification.getId() == 100) { 
    // Do something. 
    } 
} 
Các vấn đề liên quan