Всплывающие уведомления помогают пользователям следить за чатами и участвовать в них.
Они плавают поверх другого контента приложения, и пользователи могут расширять пузыри, чтобы показывать и взаимодействовать с содержимым приложения, и они могут свернуть их, когда они не используя их.
Когда устройство заблокировано или включен режим "Всегда вкл. дисплей", чаты отображаются как обычные уведомления.
Всплывающие уведомления включены пользователем. Для этого нужно нажать на кнопку всплывающего чата в уведомлениях, которые поддерживают эту функцию. Это позволит этому конкретному чату всегда всплывать. В настройках пользователи могут выбрать, какие чаты будут отображаться во всплывающих чатах, или изменить настройки для всего приложения.
Пользователи могут:
- Заблокировать все всплывающие уведомления из приложения. Уведомления не будут заблокированы, но они не будут появляться в виде всплывающих уведомлений.
- Разрешить выбранные всплывающие уведомления из приложения. Уведомления, для которых нажата кнопка всплывающего уведомления, считаются выбранными.
- Разрешить все всплывающие уведомления из приложения. Все уведомления, отправленные с помощью
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".
Чтобы отправить всплывающее уведомление, выполните следующие действия:
- Создайте уведомление как обычно.
- Вызовите
BubbleMetadata.Builder(PendingIntent, Icon)илиBubbleMetadata.Builder(String), чтобы создать объектBubbleMetadata. - Чтобы добавить метаданные в уведомление, используйте
setBubbleMetadata(). - Если вы используете Android 11 (уровень API 30) или более позднюю версию, убедитесь, что метаданные всплывающего чата или уведомление ссылаются на ярлык общего доступа.
- Измените приложение так, чтобы оно не отменяло уведомления, которые появляются в виде всплывающих чатов. Если вы отмените уведомление, чат исчезнет с экрана. Когда вы открываете всплывающий чат, связанное с ним уведомление автоматически скрывается.
Эти шаги показаны в следующем примере:
// 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 для намерения.
В противном случае новое действие запускается в новой задаче, а чат сворачивается.
Помните, что всплывающий чат представляет определенный разговор, поэтому действия, запущенные в нем, должны быть связаны с этим разговором. Кроме того, запуск действия в подсказке увеличивает стек задач подсказки и может усложнить работу пользователя, в частности с навигацией.
Рекомендации
- Отправляйте уведомление в виде всплывающего чата, только если оно важно, например является частью текущего общения или пользователь явно запросил всплывающий чат для контента. Всплывающие чаты занимают место на экране и закрывают контент других приложений.
- Убедитесь, что всплывающее уведомление также работает как обычное. Если пользователь отключит всплывающие чаты, уведомления будут показываться в обычном режиме.
- Используйте composable-функцию
BackHandlerи свяжите ее параметрenabledс состоянием интерфейса, чтобы она перехватывала нажатия кнопки "Назад" только при необходимости. После того как обработчик отключится, подсказка свернется.
Когда в свернутом чате появляется новое сообщение, на значке чата появляется значок непрочитанного сообщения. Когда пользователь открывает сообщение в связанном приложении, выполните следующие действия:
- Обновите
BubbleMetadata, чтобы уведомление больше не показывалось. Позвоните по номеруBubbleMetadata.Builder.setSuppressNotification(). Значок уведомления исчезнет, что будет означать, что пользователь взаимодействовал с сообщением. - Установите для
Notification.Builder.setOnlyAlertOnce()значениеtrue, чтобы отключить звук или вибрацию, которые сопровождают обновлениеBubbleMetadata.
Пример приложения
SociaLite – это пример приложения для общения, в котором используются всплывающие чаты. В демонстрационных целях в этом приложении используются чат-боты. В реальных приложениях используйте всплывающие чаты для сообщений от людей.