18
  • Notification.Builder出现之前,更新已经在通知托盘中的通知的方法是调用setLatestEventInfo(),然后通过NotificationManager.notify()调用将通知发回,其 ID 与notify()您拨打的第一个电话相匹配。

  • 现在setLatestEventInfo()不推荐使用消息:Use Notification.Builder而是。但我找不到任何有关如何使用Notification.Builder.

  • Notification您是否只是假设每次需要更新通知时都重新创建一个新实例?然后简单地将其传递给NotificationManager.notify()您之前使用的 ID?

  • 它似乎有效,但我想看看是否有人有任何官方证实这是新的“这样做的方式”?

我问这个的真正原因是因为在 中Android 4.1.1 Jelly Bean,通知现在每次notify()被调用时都会闪烁。当用这个更新进度条setProgress()看起来真的很糟糕并且很难点击通知。在 4.1 或以前的版本中不是这种情况。所以我想在提交错误之前确保我正确地执行了此操作。

4

4 回答 4

20

我通过调用setWhen(0)我的 Notification.Builder 解决了这个问题。在整个通知淡出/淡入的情况下,Android 的此参数的默认值似乎不适合更新通知视图的位。

Notification.Builder builder = new Notification.Builder(c)
                .setContentTitle("Notification Title")
                .setSmallIcon(R.drawable.ic_notification_icon)
                .setProgress(max_progress,current_progress,false)
                .setWhen(0);
                notification = builder.getNotification();

mNotificationManager.notify(NOTIFICATION_ID, notification);

更新:

正如WolframRittmeyer所说,使用when=0不是一种优雅的方式。我形成了如下解决方案:

if(mNotif == null) {
//either setting mNotif first time
//or was lost when app went to background/low memory
    mNotif = createNewNotification();
}
else {
    long oldWhen = mNotif.when;
    mNotif = createNewNotification();
    mNotif.when = oldWhen;
}
mNotificationManager.notify(NOTIFICATION_ID, mNotif);
于 2012-09-18T22:50:34.847 回答
2

您所做的是正确的,您只是缺少可以设置的标志。我不知道您的特定通知实现,但您可以考虑使用:

setOngoing(boolean ongoing)

或者

setOnlyAlertOnce(boolean onlyAlertOnce)
于 2012-08-09T14:00:47.650 回答
1

我猜(因为我刚才遇到了同样的麻烦)您在通知中使用了 RemoteView。我设法更新通知而不像这样闪烁:

RemoteViews views;
if( this.mNotification == null) {
    views = new RemoteViews(getPackageName(), R.layout.notification);
    this.mNotification = new Notification.Builder(this)
        .setContent(views)
        .setSmallIcon(R.drawable.status_icon)
        .setContentIntent(mNotificationAction)
        .setOngoing(true)
        .setOnlyAlertOnce(true)
        .getNotification();
} else {
    views = this.mNotification.contentView;
}

感谢@seanmonstar 回答通知栏中的刷新进度条

于 2012-09-14T13:43:18.547 回答
0

此处描述的解决方案效果很好:悄悄更新正在进行的通知

关键是用来重用builder和setOnlyAlertOnce(true):

if (firstTime) {
  mBuilder.setSmallIcon(R.drawable.icon)
  .setContentTitle("My Notification") 
  .setOnlyAlertOnce(true); 
  firstTime = false;
} 
mBuilder.setContentText(message)
.setProgress(100, progress, true);

mNotificationManager.notify(mNotificationId, mBuilder.build());
于 2013-10-21T17:53:12.963 回答