如何正确堆叠多个通知?

时间:2014-02-24 18:45:18

标签: android notifications

背景

假设我有一些事件导致显示新通知。

建议不要显示全新的通知(使用不同的ID),而是将它们堆叠在一起,如herehere所示,这样您实际上就可以替换上一个。

堆叠通知的示例:

enter image description here

作为一个例子(这只是一个例子,所以请不要坚持下去),让我们拿Gmail。如果您收到电子邮件,则会显示通知。如果用户现在点击它,它将直接进入消息本身。但是,如果有更多电子邮件到达,则通知将被替换为堆叠的通知,单击该通知时将直接转到电子邮件列表活动。不仅如此,通知还会显示新电子邮件的数量。

问题

一旦您显示通知,您就无法控制其中显示的内容。你只需更换它,你就不知道它之前是什么。

问题出现在您希望将多个通知一起堆叠到一个通知的位置,并且仍然显示有关先前通知的一些信息。

此外,根据文档,仅当用户明确驳回通知时才使用“setDeleteIntent”函数:

  

提供PendingIntent以在清除通知时发送   由用户明确表示。

问题

当您用新的数据替换之前,是否可以获取先前通知的数据?

管理通知的推荐方法是什么,以便单个用户具有特定类型和数据的意图(点击时),堆叠的意图具有不同的意图?

使用堆叠通知的应用是否真的管理其背后的数据库,并以某种方式监控它们的状态?

2 个答案:

答案 0 :(得分:0)

您可以访问可见的通知。

如段落 Updating notifications 中所述,您可以使用相同的通知ID

访问应用创建的可见通知
mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
    .setContentTitle("New Message")
    .setContentText("You've received new messages.")
    .setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
    mNotifyBuilder.setContentText(currentText)
        .setNumber(++numMessages);
    // Because the ID remains unchanged, the existing notification is
    // updated.
    mNotificationManager.notify(
            notifyID,
            mNotifyBuilder.build());
...

我还建议在本地Sqlite数据库上保存有关未读通知的信息,并在读取后将其删除。

答案 1 :(得分:-1)

这段代码可让您查看收到的所有通知,并在取消时取消特定通知。

Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
Notification n = builder.getNotification();
n.defaults |= Notification.DEFAULT_ALL;        
nm.notify(m, n);