Как использовать всплывающие уведомления для чатов

Всплывающие уведомления упрощают пользователям просмотр переписки и участие в ней.

Рисунок 1. Значок чата.

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

Когда устройство заблокировано или активен режим Always-On Display, пузырьки отображаются как обычные уведомления.

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

Пользователи могут:

  • Заблокировать все уведомления-пузыри от приложения. Уведомления не блокируются, но не показываются в виде пузырей.
  • Разрешить выбранные всплывающие уведомления от приложения. Уведомления, которые появляются при нажатии кнопки всплывающего уведомления, считаются выбранными.
  • Разрешите все всплывающие уведомления от приложения. Все уведомления, отправленные с помощью BubbleMetadata, будут показываться в виде всплывающих окон.

API всплывающих уведомлений

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

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

Ниже приведен пример кода, который позволяет реализовать пузырь.

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

Если в приложении показывается несколько пузырьков одного типа, например несколько чатов с разными контактами, активность должна поддерживать запуск нескольких экземпляров. На устройствах с Android 10 и более ранними версиями ОС уведомления не показываются в виде пузырьков, если вы не зададите для параметра documentLaunchMode значение "always". Начиная с Android 11 вам не нужно явно задавать это значение, поскольку система автоматически устанавливает для всех чатов documentLaunchMode значение "always".

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

  1. Создайте уведомление обычным способом.
  2. Вызовите BubbleMetadata.Builder(PendingIntent, Icon) или BubbleMetadata.Builder(String), чтобы создать объект BubbleMetadata.
  3. Используйте setBubbleMetadata(), чтобы добавить метаданные в уведомление.
  4. Если вы используете Android 11 (уровень API 30) или более позднюю версию, убедитесь, что метаданные пузырька или уведомление ссылаются на ярлык для обмена.
  5. Измените приложение так, чтобы оно не отменяло уведомления, которые показываются в виде всплывающих чатов. Если отменить уведомление, пузырь исчезнет с экрана. При открытии всплывающего уведомления связанное с ним уведомление автоматически скрывается.

Ниже приведен пример, в котором показаны эти шаги.

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* flags */)
val category = "com.example.category.IMG_SHARE_TARGET"

val chatPartner = Person.Builder()
    .setName("Chat partner")
    .setImportant(true)
    .build()

// Create a sharing shortcut.
val shortcutId = generateShortcutId()
val shortcut =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.chat)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

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

Как создать развернутое плавающее окно

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

Существуют методы, позволяющие задавать флаги, которые включают эти функции: setAutoExpandBubble() и setSuppressNotification().

В примере ниже показано, как настроить автоматическое разворачивание пузырька:

val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Жизненный цикл контента в пузырьке

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

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

Когда появляются пузырьки

Чтобы не мешать пользователю, пузырьки появляются только при определенных условиях.

Если приложение предназначено для Android 11 (уровень API 30) или более поздней версии, уведомление не будет показываться в виде пузырька, если оно не соответствует требованиям к уведомлениям о чатах. Если приложение поддерживает Android 10 (уровень API 29) или более ранние версии, уведомление будет показываться в виде пузырька, только если выполняется одно или несколько из следующих условий:

  • В уведомлении используется MessagingStyle и добавлен Person.
  • Уведомление относится к звонку на номер Service.startForeground, имеет category CATEGORY_CALL и содержит добавленный Person.
  • Приложение открыто, когда отправляется уведомление.

Если ни одно из этих условий не выполняется, вместо пузырька показывается уведомление.

Запуск действий из всплывающих окон

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

Чтобы запустить новое действие в той же задаче, что и пузырек: 1. Используйте контекст действий при запуске намерений, activity.startActivity(intent) и 1. Не устанавливайте флаг FLAG_ACTIVITY_NEW_TASK для намерения.

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

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

Рекомендации

  • Отправляйте уведомления в виде пузырьков только в важных случаях, например если они относятся к текущему общению или если пользователь явно запросил пузырек для контента. Они занимают место на экране и закрывают контент других приложений.
  • Убедитесь, что уведомление в виде пузырька также работает как обычное уведомление. Если пользователь отключит пузырь, уведомление будет показываться в обычном режиме.
  • Используйте компонуемый элемент BackHandler и свяжите его параметр enabled с состоянием интерфейса, чтобы перехват нажатий кнопки "Назад" выполнялся только при необходимости. Когда обработчик отключается, пузырь исчезает.

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

  • Обновите BubbleMetadata, чтобы отключить уведомление. Позвонить BubbleMetadata.Builder.setSuppressNotification(). Значок, показывающий, что пользователь взаимодействовал с сообщением, будет удален.
  • Установите для параметра Notification.Builder.setOnlyAlertOnce() значение true, чтобы отключить звук или вибрацию, которые сопровождают обновление BubbleMetadata.

Пример приложения

Пример приложения SociaLite – это приложение для общения, в котором используются пузырьки. В этом приложении для демонстрации используются чат-боты. В реальных приложениях используйте пузырьки для сообщений от людей.