Обновить текст уведомления, а не целое уведомление

прелюдия

Я пытаюсь добавить хронометр в уведомлении. Хронометр – это услуга. Каждую секунду эта строка вызывается (продолжить Thread – это «работающий» логический, timeString – это продуманная строка, показывающая время):

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

Это класс 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()); } } 

проблема

Каждую секунду уведомление удаляется и воссоздается, визуально это означает, что каждую секунду уведомление исчезает и снова появляется в списке уведомлений.

Я хотел бы просто обновить текст TITLE, а не воссоздавать уведомление полностью каждую секунду. Является ли это возможным?

Solutions Collecting From Web of "Обновить текст уведомления, а не целое уведомление"

Обязательно используйте один и тот же NotificationCompat.Builder строитель каждый раз для создания Notification !

Хотя в первый раз вам нужно все установить, во второй раз с помощью Builder вам нужно только установить значения, которые вы хотите обновить. После этого он вызывает notificationManager.notify(id, builder.build()) же, как и вы. Если вы используете один и тот же ID уведомление обновляется (важно!).

Пример:

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

Но вы также можете использовать метод setUsesChronometer класса NotificationCompat . Это автоматически отображает хронометр, используя заданную метку времени (можно установить с помощью setWhen ).

Спасибо за идею PieterAelse!

В моем случае мне пришлось пойти с этим (создать новое уведомление) для второго и последующих времен:

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

Надеюсь, поможет.