studio pie oreo notificaciones android android-notifications android-4.2-jelly-bean

oreo - api de android pie



¿Cómo actualizar correctamente una notificación post api 11? (4)

  • Antes de que Notification.Builder entrara en existencia, la forma de actualizar una notificación que ya estaba en la bandeja de notificaciones era llamar a setLatestEventInfo() y luego enviar la notificación a través de la llamada NotificationManager.notify() con una ID que coincide con la primera notify() te llamo hecho

  • Ahora setLatestEventInfo() está en desuso con el mensaje: Use Notification.Builder lugar. Pero no puedo encontrar ninguna documentación sobre cómo actualizar correctamente una notificación utilizando Notification.Builder .

  • ¿Se supone que debes recrear una nueva instancia de Notification cada vez que necesites actualizar la notificación? Luego simplemente pase eso a NotificationManager.notify() con el ID que usó antes?

  • Parece funcionar, pero quería ver si alguien tenía alguna verificación oficial de que esta es la nueva "forma de hacerlo".

Hay una razón real por la que pregunto que esto se debe a que en Android 4.1.1 Jelly Bean , la notificación ahora parpadea cada vez que se llama a Notify notify() . Al actualizar una barra de progreso con setProgress() esto se ve muy mal y hace que sea difícil tocar la notificación. Este no fue el caso en 4.1 o versiones anteriores. Así que quiero asegurarme de que estoy haciendo esto correctamente antes de presentar un error.


La solución descrita aquí funciona bien: Actualizar una notificación en curso de manera silenciosa

La clave es usar para reutilizar el constructor y 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());


Lo que estás haciendo es correcto, solo te faltan las banderas que puedes establecer. No conozco su implementación de notificación particular, pero podría considerar usar:

setOngoing(boolean ongoing)

o

setOnlyAlertOnce(boolean onlyAlertOnce)


Supongo (ya que tuve el mismo problema ahora) que está utilizando un RemoteView en su notificación. Logré actualizar la notificación sin que parpadee así:

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

Gracias a @seanmonstar por responder Actualizar la barra de progreso en la barra de notificaciones .


setWhen(0) este problema llamando a setWhen(0) en mi Notification.Builder. Parece que el valor predeterminado de Android para este argumento no se adapta a la actualización de bits de la vista de notificación sin que la notificación completa se desvanezca.

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

Actualizar:

Como dijo WolframRittmeyer , usar when=0 no es una forma elegante. Formé una solución como la siguiente:

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