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 asetLatestEventInfo()
y luego enviar la notificación a través de la llamadaNotificationManager.notify()
con una ID que coincide con la primeranotify()
te llamo hechoAhora
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 utilizandoNotification.Builder
.¿Se supone que debes recrear una nueva instancia de
Notification
cada vez que necesites actualizar la notificación? Luego simplemente pase eso aNotificationManager.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);