Благодаря пузырям пользователям проще видеть и участвовать в обсуждениях.
Всплывающие уведомления встроены в систему уведомлений. Они отображаются поверх другого контента приложения и следуют за пользователем, куда бы он ни направлялся. Пользователи могут раскрывать уведомления, чтобы отобразить контент приложения и взаимодействовать с ним, а также сворачивать их, когда они не используются.
Когда устройство заблокировано или активен режим 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"
.
Чтобы отправить сообщение, выполните следующие действия:
- Создайте уведомление , как вы это обычно делаете.
- Вызовите
BubbleMetadata.Builder(PendingIntent, Icon)
илиBubbleMetadata.Builder(String)
, чтобы создать объектBubbleMetadata
. - Используйте
setBubbleMetadata()
для добавления метаданных в уведомление. - Если вы используете Android 11 или более позднюю версию, убедитесь, что метаданные или уведомление всплывающей подсказки ссылаются на ярлык для совместного доступа.
- Измените приложение так, чтобы оно не отменяло уведомления, отображаемые в виде всплывающих окон. Чтобы проверить, запущено ли действие уведомления в виде всплывающего окна, вызовите
Activity#isLaunchedFromBubble()
. Отмена уведомления удаляет всплывающее окно с экрана. Открытие всплывающего окна автоматически скрывает связанное с ним уведомление.
Эти шаги показаны в следующем примере:
Котлин
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* 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 = ShortcutInfo.Builder(mContext, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.name) .build() // Create a bubble metadata. val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Ява
// Create a bubble intent. Intent target = new Intent(mContext, BubbleActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0 /* flags */); private val CATEGORY_TEXT_SHARE_TARGET = "com.example.category.IMG_SHARE_TARGET" Person chatPartner = new Person.Builder() .setName("Chat partner") .setImportant(true) .build(); // Create a sharing shortcut. private String shortcutId = generateShortcutId(); ShortcutInfo shortcut = new ShortcutInfo.Builder(mContext, shortcutId) .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.getName()) .build(); // Create a bubble metadata. Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create a notification, referencing the sharing shortcut. Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner);
Если при отправке всплывающего окна ваше приложение находится на переднем плане, важность игнорируется, и ваше окно всегда отображается, если только пользователь не заблокирует окна или уведомления от вашего приложения.
Создайте расширенный пузырь
Вы можете настроить всплывающее окно так, чтобы оно автоматически отображалось в развёрнутом виде. Мы рекомендуем использовать эту функцию только в том случае, если пользователь совершает действие, приводящее к появлению всплывающего окна, например, нажимает кнопку для начала нового чата. В этом случае также имеет смысл отключить отправку первоначального уведомления при создании всплывающего окна.
Существуют методы, которые можно использовать для установки флагов, включающих такое поведение: setAutoExpandBubble()
и setSuppressNotification()
.
В следующем примере показано, как настроить автоматическое отображение пузыря в развернутом состоянии:
Котлин
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Ява
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
Жизненный цикл содержимого пузыря
При развертывании пузыря активность содержимого проходит обычный жизненный цикл процесса , в результате чего приложение становится процессом переднего плана, если оно еще не является таковым.
При сворачивании или закрытии пузыря активность уничтожается. Это может привести к кэшированию процесса и его последующему завершению, в зависимости от того, запущены ли в приложении другие активные компоненты.
Когда появляются пузырьки
Чтобы не отвлекать пользователя, пузыри появляются только при определенных обстоятельствах.
Если приложение предназначено для Android 11 или более поздней версии, уведомление не отображается в виде всплывающего окна, если оно не соответствует требованиям к диалогу . Если приложение предназначено для Android 10 или более ранней версии, уведомление отображается в виде всплывающего окна только при соблюдении одного или нескольких из следующих условий:
- Уведомление использует
MessagingStyle
и содержит добавленнуюPerson
. - Уведомление получено в результате вызова
Service.startForeground
, имеетcategory
CATEGORY_CALL
и содержит добавленногоPerson
. - В момент отправки уведомления приложение находится на переднем плане.
Если ни одно из этих условий не выполнено, вместо пузырька отображается уведомление.
Запуск действий из пузырей
Когда пузырёк запускает новое действие, новое действие либо запустится в той же задаче и в том же всплывающем окне, либо в новой задаче в полноэкранном режиме, свернув пузырёк, который его запустил.
Чтобы запустить новое действие в той же задаче, что и пузырёк: 1. Используйте контекст действия при запуске намерений, activity.startActivity(intent)
и 1. Не устанавливайте флаг FLAG_ACTIVITY_NEW_TASK
для намерения.
В противном случае новое действие запускается в новой задаче, а пузырёк сворачивается.
Имейте в виду, что пузырёк представляет собой определённый диалог, поэтому действия, запускаемые внутри него, должны быть связаны с этим диалогом. Кроме того, запуск действия внутри пузыря увеличивает стек задач и может потенциально усложнить пользовательский интерфейс, особенно в части навигации.
Лучшие практики
- Отправлять уведомление в виде всплывающего окна только в случае его важности, например, если оно является частью текущего сообщения или если пользователь явно запросил всплывающее окно для отображения контента. Всплывающие окна занимают пространство на экране и закрывают другой контент приложения.
- Убедитесь, что всплывающее уведомление также работает как обычное уведомление. Когда пользователь отключает всплывающее уведомление, оно отображается как обычное уведомление.
- Вызовите
super.onBackPressed
при переопределенииonBackPressed
в активности «пузырь». В противном случае «пузырь» может вести себя некорректно.
Когда свёрнутый пузырёк получает обновлённое сообщение, в нём отображается значок, указывающий на непрочитанное сообщение. Когда пользователь открывает сообщение в соответствующем приложении, выполните следующие действия:
- Обновите
BubbleMetadata
, чтобы отключить уведомление. Вызовите методBubbleMetadata.Builder.setSuppressNotification()
. Это удалит значок, указывающий на то, что пользователь взаимодействовал с сообщением. - Установите
Notification.Builder.setOnlyAlertOnce()
наtrue
, чтобы подавить звук или вибрацию, сопровождающую обновлениеBubbleMetadata
.
Пример приложения
Пример приложения SociaLite — это приложение для общения, использующее речевые пузыри. В демонстрационных целях это приложение использует чат-ботов. В реальных приложениях речевые пузыри используются для обмена сообщениями между людьми.