用新行更新 android 通知正在删除以前的行

Upv*_*ote 2 android android-notifications

我想将通知分组为摘要。

我通过为所有通知设置一个 ID 来实现这一点。这样 android 就不会创建新的通知,而是更新现有的通知(减少代码):

Notification summaryNotification = new NotificationCompat.Builder(this)
    .setGroupSummary(true)
    .setDefaults(Notification.DEFAULT_ALL)
    .setStyle(new NotificationCompat.InboxStyle()
            .addLine(msg)
            .setBigContentTitle("My App")
            .setSummaryText("FooBar"))
    .build();

mNotificationManager.notify(uuid, summaryNotification);
Run Code Online (Sandbox Code Playgroud)

UUID 始终相同,因此应更新通知。但是,当新通知到达时,setStyle似乎会被覆盖。

这导致旧addLine(msg)的消失。但是,我希望在没有某种通知管理器服务器端的情况下添加新消息。

有什么想法或建议吗?

Pat*_*ick 5

我认为您误解了通知生成器。

NotificationCompat.Builder 构建包含所有内容的完整通知。重用相同的 id 只是告诉通知管理器将具有相同 id 的现有通知替换为新的通知:(来源

[...] 更新或创建一个 NotificationCompat.Builder 对象,从中构建一个 Notification 对象,并使用您之前使用的相同 ID 发出通知。如果之前的通知仍然可见,系统会根据 Notification 对象的内容更新它。

因此addLine不是对现有通知执行的操作,而是对您创建的新构建器(当时为空)执行的操作。

如果要使用收件箱样式向现有通知添加一行,则需要

  • 保留原始构建器对象,根据需要添加行并使用相同的 id 重新发送通知
  • 创建一个新的构建器并首先添加旧行,然后添加新行。您需要从某处存储或检索旧行(取决于您的应用程序)。

  • 如果您按照教程中的描述使用 IntentService,我建议您不要这样做:“IntentService 将接收 Intent,启动一个工作线程,并根据需要停止服务。” 因此,您的实例可能会消失 - 随之而来的是您的构建器。您可能想考虑如何保留您之前传递给构建器的数据。或者 - 如果您控制服务器 - 只需将旧数据的合理子集与通知一起发送。 (3认同)