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

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

  • 大通知图标背景
  • 如何从Android有限的时间间隔轮询Web服务?
  • 如何在android中以编程方式从通知栏中删除通知?
  • 为什么NotificationManagerCompat :: cancelAll()会得到SecurityException?
  • 使用持续通知来允许用户返回到运行Android应用程序
  • 如何在Android中安排通知
  • 如何以编程方式在android中解除/取消状态栏通知
  • Android通知操作未被触发(PendingIntent)
  • 我通过在我的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());