Android 如何跟踪通知以了解何时显示摘要通知

Android 如何跟踪通知以了解何时显示摘要通知,android,notifications,android-notification-bar,Android,Notifications,Android Notification Bar,我想模仿Gmail在通知栏通知方面的应用行为,这符合推荐的Android模式: 当应用程序处于后台并且我收到一封新电子邮件时,我会在通知栏中收到如下通知: Line 1 : Jane Smith Line 2 : Hi John, this is a sample message... 也就是说,一个特定于单个邮件的通知,点击它会导致屏幕显示该特定电子邮件。如果我通过刷卡或使用“全部清除”清除通知,那么当我收到一条新消息时,我将收到另一条特定于消息的通知。但是如果我没有清除它,并且我收到另一封

我想模仿Gmail在通知栏通知方面的应用行为,这符合推荐的Android模式:

当应用程序处于后台并且我收到一封新电子邮件时,我会在通知栏中收到如下通知:

Line 1 : Jane Smith
Line 2 : Hi John, this is a sample message...
也就是说,一个特定于单个邮件的通知,点击它会导致屏幕显示该特定电子邮件。如果我通过刷卡或使用“全部清除”清除通知,那么当我收到一条新消息时,我将收到另一条特定于消息的通知。但是如果我没有清除它,并且我收到另一封电子邮件,那么通知将变成一个摘要通知,上面写着“2条新消息”,点击它将进入收件箱

我知道如何更新通知,问题是如何确定通知栏中还有哪些通知(如果有)。答案并不是那么简单,因为通知不会反映我有多少未读的消息,它必须反映哪些消息仍然没有被用户通过点击通知或清除通知来确认

我是否应该通过保存我们启动的通知、点击的通知(内容意图)和清除的通知(删除意图)的列表来跟踪通知?我认为这种方法不够安全。。。例如:如果由于我启动手机而清除了通知,会发生什么情况?我应该在哪里跟踪仍然显示的通知?共享偏好


你通常如何解决这个问题

我也遇到了同样的问题,我还查看了Gmail的相应行为。我首先研究了以下场景:

假设用户正在积极使用Gmail应用程序(不考虑与浏览器版本的任何交互),然后离开它:

  • 从那时起,如果用户收到新的电子邮件,就会收到通知
  • 如果通知仍然存在,并且用户收到新的电子邮件,则通知将更新为摘要,其中包含自用户上次使用应用程序以来的N封最新电子邮件的标题
  • 如果用户拒绝通知并且另一封电子邮件到达,则会发出另一封摘要通知
  • 如果用户导航回应用程序(通过单击或不单击通知),任何现有通知都将被取消
  • 在API 18中,Android增加了对使用检索活动通知的支持,但是这对于我正在开发的应用程序(min API 14)来说太晚了,更不用说如果用户已经拒绝了现有的通知信息,你就不能依靠它来获取现有的通知信息

    因此,我找到的解决方案是保留有关本地已发布通知的信息,使用该信息创建单个通知或摘要,并在用户再次打开应用程序时清除所有内容

    为了持久保存通知信息,我创建了一个类似于以下内容的简单模型:

    public class NotificationBundle {
        private String mText;
        // Add any other relevant information about your notification here, 
        // particularly what you used to create your notification intent 
        // i.e. an item/message id to highlight, maybe?
    
        public String getText() {
            return mText;
        }
    
        public void setText(final String text) {
            mText = text;
        }
    }
    
    其思想是为您发出的每个通知创建一个实例

    然后,您必须有一种方法来保存
    NotificationBundle
    对象列表。我使用了
    SharedReferences
    来实现这一点,但是您可以使用其他更适合您的方法(比如DB表)。为了在
    SharedReferences
    中持久化
    列表
    ,我使用
    Gson
    将数组序列化为json,然后将其保存为字符串。假设您可以使用
    SharedReferences
    ,您可以在下面的示例中找到如何进行序列化

    有了这样的结构,基本上你要做的是:

    • 当您必须发出通知时:

    • 使用要通知的信息创建一个新的
      NotificationBundle
    • SharedReferences
    • 如果捆绑包列表为空,您将发出一个通知。如果不是,您将发布摘要-在这种情况下,您可以使用捆绑包列表来构建摘要的内容。关于摘要通知的一篇好文章是[使用大视图样式]
    • 将新的
      NotificationBundle
      (from1)添加到现有的
      列表(from2)中,并将其保存到
      SharedReferences
    • 使用
      NotificationManager.notify()
      发出通知。如果您始终在此处使用相同的通知id,则如果应用程序中的通知当前不可见,它将创建一个新通知,或者如果以前的通知可见,它将仅更新通知
    • 在主要活动的
      onResume()
      方法上,确保使用
      NotificationManager.cancelAll()关闭所有通知。还要确保从您的
      共享引用中删除现有的
      列表


    这就可以了。

    如果您保存了摘要通知的Id,您可以发送另一个带有该Id的通知,如果已经存在具有相同标题、日期等的通知,则该通知将无效。。。,如果没有事先通知,将创建一个新的通知。

    @fekke如果对您有效,请将其标记为“已答复”好吗?谢谢:)