2015-10-20 71 views
0

我有一個服務在每次收到新的GCM消息時顯示通知PendingIntent。問題是GCM消息可能是不同的。而如果有許多的通知離開未讀,我想不分開,但在團體,如告訴他們:獲取看不見的android通知

你有型的3個未讀消息的

你有B型的2個未讀郵件

你有4個未讀消息的類型C

據我所知,爲了得到這種效果,我需要訪問未讀/不可見通知。每當我收到新的通知時,我都可以檢查是否存在另一個此類型的未讀消息,然後決定是創建新通知還是更新舊通知。

我的問題是:有沒有辦法看到,哪些通知是看不見的,並得到訪問它們

對於任何情況,這是我創建消息的方法;如果參數notificationId爲0,則應創建新的通知。其他 - 已更新。

private int sendNotification(String msg, Integer notificationId) { 

    Log.d(TAG, "sending message with text: "+msg); 
    mNotificationManager = (NotificationManager) 
      this.getSystemService(Context.NOTIFICATION_SERVICE); 

    Random random = new Random(); 
    int notification_id = notificationId==0?random.nextInt(9999 - 1000) + 1000:notificationId; 

    RemoteViews remoteViews = new RemoteViews(getPackageName(), 
      R.layout.notification); 

    Intent intent = new Intent(this, MainActivity.class); 
    // Send data to NotificationView Class 
    intent.putExtra("text", msg); 

    PendingIntent pending= PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this) 
    .setSmallIcon(R.drawable.ic_launcher) 
    .setContentTitle("escos") 
    .setStyle(new NotificationCompat.BigTextStyle() 
      .bigText(msg)) 
    .setContentText(msg); 
    mBuilder.setContentIntent(pending); 
    mBuilder.setContent(remoteViews); 

    remoteViews.setTextViewText(R.id.notiftext, msg); 
    remoteViews.setImageViewResource(R.id.notifim, R.drawable.ic_launcher); 

    Notification notification = mBuilder.build(); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    mNotificationManager.notify(notification_id, notification); 

    return notification_id; 
} 

回答

1
  1. 對於狀態欄不同的通知條帶(A,B,C等),使用不同的NOTIFICATION_ID用於構建上的您從GCM接收defined typecollapse_key基礎通知。

  2. 爲了確定未讀消息,可以使用在共享偏好的本地變量(計數器)和每個通知的特定類型的到來時(上定義的類型或collapse_key的計)的時間加一。

  3. 然後生成具有該特定NOTIFICATION_ID的通知作爲具有特定NOTIFICATION_ID的通知可以相互覆蓋。因此,您可以在新通知中覆蓋之前帶有迭代編號文本的通知。

  4. 只要用戶點擊任何通知或特定通知,清除通知並重置共享首選項中的(計數器)值。

EDIT1:

NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
try { 
     nMgr.cancelAll(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

注:當你點擊尤其掛起的意圖通知,從您的應用程序生成的,然後在活動中使用此代碼刪除所有通知發請記得在撥打cancelAll()之前添加Try-Catch,因爲cancelAll()可能不支持設備型號,並且會生成

java.lang.SecurityException異常:權限拒絕

錯誤。

編輯2: 您還可以使用nMgr.cancel(NOTIFICATION_ID);清除特定的通知,通過額外NOTIFICATION_ID傳遞給特定的意圖,並獲得額外該活動取消特定的通知。

而且當您點擊任何通知時,它將從狀態欄中清除,除非您尚未在Notification Builder中設置.setAutoCancel(false)

+0

謝謝你,這實際上是我計劃如何做到這一點。但我不知道如何實現4.你的名單。 – user2957954

+0

@ user2957954請參閱'Edit1'。 –

+0

如果通知被清除或點擊,如何處理仍然不清楚。 – user2957954