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应用程序(忽略与浏览器版本的任何交互),然后导航离开它:
在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,您可以在此答案中找到如何进行序列化.
有了这个结构,基本上你要做的就是:
当您必须发出通知时:
NotificationBundle使用要通知的信息创建新的.List<NotificationBundle>的SharedPreferencesNotificationBundle(从1)添加到现有List<NotificationBundle>(从2)并保存到SharedPreferences.NotificationManager.notify().如果您始终在此处使用相同的通知ID,则会在您的应用中当前未显示任何通知时创建新通知,或者如果之前的通知可见,则会立即更新通知.在您onResume()的主要活动的方法上,请务必使用以下内容解除所有通知NotificationManager.cancelAll().另外,请务必从SharedPreferences现有内容中删除List<NotificationBundle>.
这应该可以解决问题.
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |