Intereting Posts
Изменение образа ImageView программным способом Простой вид калибра, такой как speedmeter in android? Как заставить AccountManager отображать экран «Запрос доступа» после того, как пользователь уже разрешил доступ? Как получить несколько значков для запуска различных действий в одном приложении? Как изменить прозрачность (альфа) представления на pre-SDK-11 на Android? Исходный код драйверов устройств хранения и сетевых устройств для Nexus 6 и Samsung Galaxy S6 Android 2.1: Как мне рассчитать значение RSSI существующего соединения Bluetooth? Android анимация флип-обложки и легкость (открытая книжная анимация) Кордова: Android SDK не найден. Убедитесь, что он установлен. Если он не находится по умолчанию, установите переменную среды ANDROID_HOME Как настроить навигационный ящик для открытия справа налево Content Observer onChange метод, вызываемый дважды после 1 изменения курсора Размещение элементов управления масштабированием в MapView Пакет отказов Gradle не существует Node.js npm на Android Запуск анимации по кадрам

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

прелюдия

Я пытаюсь добавить хронометр в уведомлении. Хронометр – это услуга. Каждую секунду эта строка вызывается (продолжить 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); 

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