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

fek*_*kke 8 notifications android android-notification-bar

我想模仿Gmail有关通知栏通知的应用行为,该通知栏符合推荐的Android模式:http://developer.android.com/design/patterns/notifications.html

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

Line 1 : Jane Smith
Line 2 : Hi John, this is a sample message...
Run Code Online (Sandbox Code Playgroud)

也就是说,一个特定于单个消息的通知,并点击它会导致显示该特定电子邮件的屏幕.如果我通过滑动或"全部清除"清除通知,那么当我收到新消息时,我将收到另一个特定于消息的通知.但是,如果我不清除它并收到另一封电子邮件,则通知将变为摘要通知,说明"2条新消息",然后点击它会进入收件箱.

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

我是否应该通过保留我们发布的通知列表,被点击的通知(内容意图)和清除的通知(删除意图)来跟踪通知?我不认为这种方法足够安全......例如:如果通知因为我启动手机而被清除会怎样?我应该在哪里跟踪仍然显示的通知?共享偏好?

你通常如何解决这个问题?

小智 15

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

假设用户正在使用Gmail应用程序(忽略与浏览器版本的任何交互),然后导航离开它:

  1. 从那时起,如果用户收到新电子邮件,它将收到通知.
  2. 如果通知仍然存在且用户收到新电子邮件,则通知将更新为包含自用户上次使用该应用以来最近N封电子邮件标题的摘要.
  3. 如果用户解除通知并且另一封电子邮件到达,则发出另一个摘要通知.
  4. 如果用户导航回应用程序(通过单击通知或不通知),则任何现有通知都将被解除.

在API 18中,Android添加了使用NotificationListenerService检索活动通知的支持,但是对于我正在使用的应用程序来说这是最近的(最小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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是为您发出的每个通知创建一个实例.

然后你必须有一种方法来持久保存你的NotificationBundle对象列表.我曾经SharedPreferences这样做,但你可以使用其他更适合你的东西(比如数据库表).坚持一个List<NotificationBundle>SharedPreferences我用Gson序列化阵列为JSON,然后保存,作为一个字符串.假设您可以使用SharedPreferences,您可以在此答案中找到如何进行序列化.

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

  • 当您必须发出通知时:

    1. NotificationBundle使用要通知的信息创建新的.
    2. 检索您现有List<NotificationBundle>SharedPreferences
    3. 如果您的捆绑包列表为空,您将发出一个通知.如果不是,您将发布摘要 - 在这种情况下,您可以使用捆绑包列表来构建摘要的内容.有关摘要通知的好文章是[使用大视图样式].
    4. 将新的NotificationBundle(从1)添加到现有List<NotificationBundle>(从2)并保存到SharedPreferences.
    5. 使用发布您的通知NotificationManager.notify().如果您始终在此处使用相同的通知ID,则会在您的应用中当前未显示任何通知时创建新通知,或者如果之前的通知可见,则会立即更新通知.
  • 在您onResume()的主要活动的方法上,请务必使用以下内容解除所有通知NotificationManager.cancelAll().另外,请务必从SharedPreferences现有内容中删除List<NotificationBundle>.

这应该可以解决问题.