Как создать уведомления в реальном времени

Новости в реальном времени позволяют пользователям следить за важными событиями, не открывая приложение. Система продвигает уведомления о новостях в реальном времени, но пользователи могут временно закрыть их или понизить до стандартных уведомлений. Продвигаемые уведомления показываются на более заметных местах, например вверху панели уведомлений и заблокированного экрана, а также в виде чипа в строке состояния. Уведомления о новостях в реальном времени должны соответствовать принципам уведомлений, чтобы предоставлять краткую, своевременную и актуальную информацию.

Рисунок 1. Пример уведомления в реальном времени.

Карточки продвигаемых уведомлений имеют следующие характеристики:

  • Развернуто по умолчанию
  • Несворачиваемый

Чтобы уведомление считалось новостью в реальном времени, оно должно соответствовать следующим требованиям:

Характеристики промоакции

Следующие API помогают определить, будет ли система продвигать ваше уведомление:

  • Notification.FLAG_PROMOTED_ONGOING указывает, продвигается ли уведомление.
  • Notification.hasPromotableCharacteristics() проверяет, может ли система продвигать уведомление. Этот метод не учитывает, отключил ли пользователь обновления в реальном времени для приложения в настройках.
  • NotificationManager.canPostPromotedNotifications() проверяет, может ли приложение публиковать рекламные уведомления, например включил или отключил ли их пользователь в настройках.
  • Settings.ACTION_MANAGE_APP_PROMOTED_NOTIFICATIONS – это действие, которое позволяет приложениям перенаправлять пользователей в настройки, чтобы включить эту функцию.

Критерии использования

Используйте обновления в реальном времени для текущих, инициированных пользователем и срочных действий.

Рисунок 2. Новости в реальном времени на главном и заблокированном экранах, а также в виде чипа.

Текущее

Обновление в реальном времени должно представлять действие, которое активно выполняется и имеет четкое начало и конец. Если событие уже произошло, не используйте виджеты Live Update. Вместо этого используйте стандартное уведомление. Это также относится к событиям, которые ещё не начались, хотя для событий, которые скоро начнутся, можно использовать Live Update.

Обновления в реальном времени представляют текущие действия. Не используйте обновления в реальном времени, чтобы ускорить доступ к функциям приложения. Для этого используйте виджет приложения или параметр быстрых настроек.

  • Примеры допустимого использования: активная навигация, текущие телефонные звонки, активное отслеживание поездки или доставки еды.
  • Недопустимые варианты использования. Реклама, промоакции, сообщения чата, оповещения, предстоящие мероприятия в календаре и быстрый доступ к функциям приложения.

Включается пользователем

Большинство обновлений в реальном времени должны представлять действия, которые явно запускаются пользователем, например начало тренировки, запуск навигации за рулем или вызов такси. Не показывайте в виджете Live Update информацию об окружении пользователя, его интересах или предстоящих событиях. Не разрешайте сторонним действиям генерировать обновления в реальном времени.

Иногда пользователь может выполнить действие, которое инициирует активность в будущем. Например, если пользователь покупает билеты на самолет или концерт, регистрируется на турнир или иным образом указывает, что планирует посетить мероприятие, привязанное к определенному времени. В таких случаях может быть целесообразно автоматически показывать новости в реальном времени, когда начинается запланированное событие. Однако приложения должны настраивать триггеры так, чтобы они появлялись только тогда, когда действие неизбежно. Если пользователь явно указывает, что хочет начать отслеживать фоновое событие, например спортивный матч, вы можете начать публиковать новости в реальном времени для этого события. Однако в связанном уведомлении также должно быть действие Открепить.

Срочные

Показывайте обновление в реальном времени, только если оно требует внимания пользователя на протяжении всего действия. Основной вариант использования уведомлений в реальном времени – мониторинг, когда пользователь получает значительную выгоду, взглянув на уведомление в реальном времени, чтобы следить за развивающимся состоянием активности.

Обновления в реальном времени часто подходят для действий, которые переключаются между обновлениями в реальном времени и обычными уведомлениями. Например, уведомление о посадочном талоне уместно за несколько часов до вылета, но оно должно стать обновлением в реальном времени, только когда у пользователя возникнет острая необходимость, например когда он прибудет в аэропорт или на место проведения мероприятия или после начала посадки. А вот для отслеживания посылки виджет Live Update не подходит, потому что пользователю не нужно постоянно следить за этим.

Рекомендации по улучшению интерфейса

Используйте значок трекера, чтобы визуализировать состояние. Эти данные могут обновляться динамически.

специальный трекер на индикаторе выполнения
Рисунок 3. Пользовательский значок трекера.

Если расчетное время прибытия вычисляется или пока недоступно, не показывайте пустую область. Добавьте текст-плейсхолдер, например "Думаю…" или "Перестраиваю маршрут…", чтобы показать, что система работает, как показано в примере.

непустое состояние, чтобы показать, что идет обработка
Рисунок 4. Непустое состояние для обновления в реальном времени.

Чипы статуса

Чипы статуса позволяют пользователям следить за новостями в реальном времени, когда уведомление не видно. Используйте setShortCriticalText или setWhen, чтобы передавать важную информацию о состоянии уведомления, ориентированного на прогресс.

чип статуса со значком
Рисунок 5. В неопределенном состоянии показывается маленький значок Notification.Builder#setSmallIcon.
чип статуса со временем
Рисунок 6. Используйте Notification.Builder#setShortCriticalText, чтобы показать абсолютное время.
чип статуса с информацией
Рисунок 7. Используйте Notification.Builder#setShortCriticalText, чтобы передать важную информацию.

Время

Время запускает обратный отсчет для продолжительности уведомления, если только уведомление не отклонено или не обновлено. Ниже описано, как работает время в различных ситуациях.

  • Если до указанного времени осталось не менее двух минут, например текущее время – 10:05, а указанное – 10:10, то на чипе будет написано 5 мин.
  • Если время уже прошло, текст не показывается.
  • Если вы используете Chronometer, на чипе можно показывать таймер. Ознакомьтесь с setUsesChronometer и setChronometerCountdown. Таймер Chronometer показывается в чипе, пока его значение положительное.
  • Если вы не хотите, чтобы в уведомлении показывалось время, используйте setShowWhen, чтобы FALSE.

Внешний вид чипа статуса

Чип статуса всегда содержит значок и может содержать текст. Максимальная ширина чипа – 96 dp. Текст будет показан, только если он полностью помещается в чип. Текст показывается в зависимости от следующих критериев:

  • Если в тексте меньше семи символов, он показывается полностью.
  • Если будет показано меньше половины текста, оставьте только значок.
  • Если можно показать больше половины текста, покажите как можно больше.

Wear OS

Новости в реальном времени передаются на некоторые подключенные устройства Wear OS. Подробнее о том, как работает перенос и как создавать локальные обновления в реальном времени для Wear OS, рассказывается в руководстве по обновлениям в реальном времени для Wear OS.

Dismissal

Пользователи могут управлять видимостью уведомлений на панели уведомлений. Публикация нежелательных уведомлений в реальном времени может привести к тому, что пользователи отзовут у приложения разрешение на публикацию.

Чтобы пользователи не отключали обновления в реальном времени, не публикуйте информацию, которую они могут счесть неинтересной. Не публикуйте повторно новости в реальном времени, которые пользователь отклонил. Чтобы обнаружить отклоненные обновления, используйте setDeleteIntent.

Чтобы поэкспериментировать с этими API, воспользуйтесь примером приложения.

Часто задаваемые вопросы

Вопрос. Что означает белая точка в конце индикатора выполнения?

Конец индикатора выполнения специальных возможностей
Рисунок 8. Визуализация доступности в конце маршрута

Ответ. Белая точка в конце индикатора выполнения визуально обозначает его конец.

Вопрос. Почему для новостей в реальном времени не поддерживаются специальные уведомления?

Ответ. Специальные уведомления усложняют тестирование и ухудшают UX, поскольку их поведение значительно различается в зависимости от версии Android и производителя устройства. Не используйте специальные уведомления с помощью RemoteViews.