获取看不见的Android通知

时间:2015-10-20 09:28:14

标签: android android-notifications android-pendingintent

我有一项服务,每次收到新的GCM消息时都会显示PendingIntent通知。问题是GCM消息可以是不同类型的。如果许多通知未读,我不想单独显示它们,而是在以下组中显示:

  

您有3条未读类型的消息

     

您有2条未读消息的B类型

     

您有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 个答案:

答案 0 :(得分:1)

  1. 对于状态栏中的其他通知条(A,B,C等),请使用不同的 NOTIFICATION_ID 根据您的defined type或{{来构建通知1}}从GCM收到。

  2. 要确定未读读取消息,请在共享首选项中使用本地变量(计数器),并在每次发出特定类型的通知时将其递增(打开)定义类型的基础或collapse_key)。

  3. 然后使用特定的NOTIFICATION_ID生成通知,因为具有特定NOTIFICATION_ID的通知可以互相覆盖。因此,您可以使用新通知中的迭代编号文本覆盖以前的通知。

  4. 用户点击任何通知或特定通知后,请立即清除通知并重置共享首选项中的(计数器)值。

  5. 编辑1:当您点击带有特定待处理意图的通知时,在该活动中使用此代码删除您应用中生成的所有通知:

    collapse_key

    注意:请务必在致电NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); try { nMgr.cancelAll(); } catch (Exception e) { e.printStackTrace(); } 之前添加Try-Catch,因为设备型号可能不支持cancelAll()并且会生成

      

    java.lang.SecurityException:Permission Denial

    错误。

    编辑2: 您还可以使用cancelAll()清除特定通知,通过附加内容将NOTIFICATION_ID传递给特定意图,并获取该活动中的额外内容以取消特定通知。

    当您点击任何通知时,除非您未在通知构建器中设置nMgr.cancel(NOTIFICATION_ID);,否则它将从状态栏中清除。