Android 如何跟踪通知以了解何时显示摘要通知
我想模仿Gmail在通知栏通知方面的应用行为,这符合推荐的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... 也就是说,一个特定于单个邮件的通知,点击它会导致屏幕显示该特定电子邮件。如果我通过刷卡或使用“全部清除”清除通知,那么当我收到一条新消息时,我将收到另一条特定于消息的通知。但是如果我没有清除它,并且我收到另一封
Line 1 : Jane Smith
Line 2 : Hi John, this is a sample message...
也就是说,一个特定于单个邮件的通知,点击它会导致屏幕显示该特定电子邮件。如果我通过刷卡或使用“全部清除”清除通知,那么当我收到一条新消息时,我将收到另一条特定于消息的通知。但是如果我没有清除它,并且我收到另一封电子邮件,那么通知将变成一个摘要通知,上面写着“2条新消息”,点击它将进入收件箱
我知道如何更新通知,问题是如何确定通知栏中还有哪些通知(如果有)。答案并不是那么简单,因为通知不会反映我有多少未读的消息,它必须反映哪些消息仍然没有被用户通过点击通知或清除通知来确认
我是否应该通过保存我们启动的通知、点击的通知(内容意图)和清除的通知(删除意图)的列表来跟踪通知?我认为这种方法不够安全。。。例如:如果由于我启动手机而清除了通知,会发生什么情况?我应该在哪里跟踪仍然显示的通知?共享偏好
你通常如何解决这个问题 我也遇到了同样的问题,我还查看了Gmail的相应行为。我首先研究了以下场景: 假设用户正在积极使用Gmail应用程序(不考虑与浏览器版本的任何交互),然后离开它:
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
- 如果捆绑包列表为空,您将发出一个通知。如果不是,您将发布摘要-在这种情况下,您可以使用捆绑包列表来构建摘要的内容。关于摘要通知的一篇好文章是[使用大视图样式]
- 将新的
(from1)添加到现有的NotificationBundle
列表(from2)中,并将其保存到
SharedReferences
- 使用
发出通知。如果您始终在此处使用相同的通知id,则如果应用程序中的通知当前不可见,它将创建一个新通知,或者如果以前的通知可见,它将仅更新通知NotificationManager.notify()
- 在主要活动的
方法上,确保使用onResume()
NotificationManager.cancelAll()关闭所有通知。还要确保从您的
共享引用中删除现有的
列表
这就可以了。如果您保存了摘要通知的Id,您可以发送另一个带有该Id的通知,如果已经存在具有相同标题、日期等的通知,则该通知将无效。。。,如果没有事先通知,将创建一个新的通知。@fekke如果对您有效,请将其标记为“已答复”好吗?谢谢:)