Обновить текст уведомления, а не целое уведомление
Прелюдия
Я пытаюсь добавить хронометр в уведомление. Хронометр - это сервис. Каждую секунду эта строка вызывается (продолжить 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, а не воссоздавать уведомление полностью каждую секунду. Возможно ли это?
Ответы
Ответ 1
Обязательно используйте один и тот же конструктор 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).
Ответ 2
Спасибо за идею PieterAelse!
В моем случае мне пришлось пойти с этим (создать новое уведомление) для второго и последующих времен:
builder.setContentText(getConvertedTime(millisUntilFinished));
Notification notification = builder.getNotification();
notification.flags = Notification.FLAG_ONGOING_EVENT;
nm.notify(R.string.app_name,notification);
Надеюсь, что это поможет.