Actualizar el texto de la notificación, no toda la notificación

Preludio

Estoy tratando de agregar un cronómetro en la notificación. El cronómetro es un servicio. Cada segundo se llama a esta línea (continue Thread es un booleano “en ejecución”, timeString es la cadena elaborada que muestra el tiempo):

NotificationChrono.updateNotification(getApplicationContext(), continueThread, NOTIF_ID, timeString, "Chronometer", notificationManager); 

Esta es la clase NotificationChrono:

 public class NotificationChrono { static public void updateNotification(Context context, boolean running, int id, String title, String text, NotificationManager notificationManager) { Intent stopIntent = new Intent("com.corsalini.david.barcalc.STOP"); PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context, 0, stopIntent, 0); Intent startIntent = new Intent( "com.corsalini.david.barcalc.STARTPAUSE"); PendingIntent startPendingIntent = PendingIntent.getBroadcast(context, 0, startIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder( context) .setContentText(context.getString(R.string.notif_text)) .setContentTitle(title) .setSmallIcon(R.drawable.ic_action_alarm_2) .setAutoCancel(false) .setOngoing(running) .setOnlyAlertOnce(true) .setContentIntent( PendingIntent.getActivity(context, 10, new Intent( context, FrontActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0)) .addAction( running ? R.drawable.ic_action_pause : R.drawable.ic_action_play, running ? context.getString(R.string.pause) : context .getString(R.string.start), startPendingIntent) .addAction(R.drawable.ic_action_stop, context.getString(R.string.stop), stopPendingIntent); notificationManager.notify(id, builder.build()); } } 

Problema

Cada segundo, la notificación se borra y vuelve a crear, visualmente significa que cada segundo la notificación desaparece y reaparece en la lista de notificaciones.

Lo que me gustaría es actualizar el texto TITLE, no recreando la notificación por completo cada segundo. ¿Es posible?

¡Asegúrate de usar el mismo generador de NotificationCompat.Builder cada vez para crear la Notification !

Aunque la primera vez que tiene que configurar todo, la segunda vez que utiliza el Builder solo tiene que establecer los valores que desea actualizar. Después de eso, llama a notificationManager.notify(id, builder.build()) tal como lo hiciste. Si usa la misma ID , la notificación se actualiza (¡es importante!).

Ejemplo:

 //First time NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentText(context.getString(R.string.notif_text)) .setContentTitle(title) .setSmallIcon(R.drawable.ic_action_alarm_2) .setAutoCancel(false) .setOngoing(running) .setOnlyAlertOnce(true) .setContentIntent( PendingIntent.getActivity(context, 10, new Intent(context, FrontActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0) ) .addAction(running ? R.drawable.ic_action_pause : R.drawable.ic_action_play, running ? context.getString(R.string.pause) : context.getString(R.string.start), startPendingIntent) .addAction(R.drawable.ic_action_stop, context.getString(R.string.stop), stopPendingIntent); notificationManager.notify(id, builder.build()); //Second time builder.setContentTitle(title); notificationManager.notify(id, builder.build()); 

Pero también puede usar el método setUsesChronometer de la clase NotificationCompat . Esto muestra automáticamente un cronómetro usando la marca de tiempo dada (capaz de establecer con setWhen ).

Gracias por la idea PieterAelse!

En mi caso, tuve que ir con esto (crear una nueva notificación) para el segundo y siguientes tiempos:

  builder.setContentText(getConvertedTime(millisUntilFinished)); Notification notification = builder.getNotification(); notification.flags = Notification.FLAG_ONGOING_EVENT; nm.notify(R.string.app_name,notification); 

Espero eso ayude.