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

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

Рисунок 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 или более позднюю версию, убедитесь, что метаданные или уведомления всплывающей подсказки ссылаются на ярлык общего доступа.
  5. Измените свое приложение так, чтобы оно не отменяло уведомления, которые появляются в виде пузырей. Чтобы проверить, запущено ли действие уведомления в виде пузыря, вызовите 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 — это приложение для разговоров, использующее пузыри. Для демонстрационных целей это приложение использует чат-ботов. В реальных приложениях используйте пузыри для сообщений от людей.