如何正确更新通知后的API 11?

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

Solutions Collecting From Web of "如何正确更新通知后的API 11?"

我通过在我的Notification.Builder上调用setWhen(0)来解决这个问题。 看来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不是一种优雅的方式。 我形成了如下的解决scheme:

 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); 

你在做什么是正确的,你只是想念你可以设置的标志。 我不知道你的具体通知实施,但你可以考虑使用:

 setOngoing(boolean ongoing) 

要么

 setOnlyAlertOnce(boolean onlyAlertOnce) 

我猜(因为我刚刚有同样的麻烦),你在通知中使用了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回复通知栏中的刷新进度条 。

这里描述的解决scheme运作良好: 悄悄地更新正在进行的通知

关键是用来重用构build器和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());