Używaj dymków, aby umożliwić użytkownikom uczestniczenie w rozmowach

Dymki ułatwiają użytkownikom wyświetlanie rozmów i uczestniczenie w nich.

Rysunek 1. Dymek czatu.

Dymki są wbudowane w system powiadomień. Pływają nad innymi treściami w aplikacji i podążają za użytkownikiem w dowolnym miejscu. Użytkownicy mogą rozwijać dymki, aby ujawniać funkcje i informacje, oraz zwijać je, gdy nie są używane.

Gdy urządzenie jest zablokowane lub włączony jest tryb Zawsze na ekranie, dymki wyświetlają się tak jak zwykle.

Dymki można wyłączyć. Gdy aplikacja wyświetla pierwszy dymek, okno uprawnień ma dwie opcje:

  • Blokuj wszystkie dymki z aplikacji. Powiadomienia nie są blokowane, ale nigdy nie pojawiają się jako dymki.
  • Zezwól na wszystkie dymki z aplikacji. Wszystkie powiadomienia wysyłane z aplikacji BubbleMetaData wyświetlają się jako dymki.

Interfejs API dymku

Dymki są tworzone przez interfejs API powiadomień, więc wysyłaj powiadomienia w zwykły sposób. Jeśli chcesz, by powiadomienie wyświetlało się jako dymek, dołącz do niego dodatkowe dane.

Rozwinięty widok dymku jest tworzony na podstawie wybranej przez Ciebie aktywności. Skonfiguruj aktywność tak, aby wyświetlała się prawidłowo jako dymek. Aktywność musi być zmieniona i umieszczana. W przeciwnym razie wyświetla się jako powiadomienie.

Poniższy kod ilustruje sposób implementacji prostego bąbelka:

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

Jeśli w aplikacji wyświetla się kilka dymków tego samego typu, np. wiele rozmów na czacie z różnymi kontaktami, aktywność musi mieć możliwość uruchamiania wielu wystąpień. Na urządzeniach z Androidem 10 lub starszym powiadomienia nie wyświetlają się jako dymki, chyba że jednoznacznie ustawisz wartość "always" na documentLaunchMode. Począwszy od Androida 11 nie trzeba jednoznacznie ustawiać tej wartości, ponieważ system automatycznie ustawia wartość documentLaunchMode we wszystkich rozmowach na "always".

Aby wysłać dymek, wykonaj te czynności:

  1. Utwórz powiadomienie w zwykły sposób.
  2. Wywołaj BubbleMetadata.Builder(PendingIntent, Icon) lub BubbleMetadata.Builder(String), aby utworzyć obiekt BubbleMetadata.
  3. Użyj setBubbleMetadata(), aby dodać metadane do powiadomienia.
  4. Jeśli kierujesz aplikację na Androida 11 lub nowszego, upewnij się, że metadane lub powiadomienie w dymku wskazują skrót do udostępniania.

Czynności te zostały pokazane w tym przykładzie:

Kotlin

// 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)

Java

// 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);
.

Jeśli w chwili wysyłania dymku aplikacja działa na pierwszym planie, ważność jest ignorowana, a dymek zawsze się wyświetla, chyba że użytkownik zablokuje dymki lub powiadomienia z aplikacji.

Utwórz rozwinięty dymek

Możesz skonfigurować dymek tak, aby automatycznie wyświetlał go w stanie rozwiniętym. Zalecamy korzystanie z tej funkcji tylko wtedy, gdy użytkownik wykona działanie powodujące wyświetlenie dymka, takie jak kliknięcie przycisku rozpoczynania nowego czatu. W takim przypadku warto też pominąć początkowe powiadomienie wysyłane po utworzeniu dymka.

Oto metody ustawiania flag, które umożliwiają takie zachowania: setAutoExpandBubble() i setSuppressNotification().

Poniższy przykład pokazuje, jak skonfigurować dymek tak, aby automatycznie wyświetlał się w stanie rozwiniętym:

Kotlin

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

Java

Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIntent(bubbleIntent)
        .setAutoExpandBubble(true)
        .setSuppressNotification(true)
        .build();

Cykl życia treści dymków

Po rozwinięciu dymka aktywność dotycząca treści przechodzi przez normalny cykl życia, w wyniku czego aplikacja staje się procesem na pierwszym planie, jeśli jeszcze nie jest tym procesem.

Gdy dymek zostanie zwinięty lub zamknięty, aktywność zostaje zniszczona. Może to spowodować przechowywanie w pamięci podręcznej i późniejsze zakończenie procesu w zależności od tego, czy aplikacja ma uruchomione inne komponenty na pierwszym planie.

Kiedy pojawiają się dymki

Aby ograniczyć zakłócenia, dymki pojawiają się tylko w określonych sytuacjach.

Jeśli aplikacja jest kierowana na Androida 11 lub nowszego, powiadomienie nie wyświetli się w dymku, chyba że będzie spełniać wymagania dotyczące rozmów. Jeśli aplikacja jest kierowana na Androida 10 lub starszego, powiadomienie wyświetli się w formie dymka tylko wtedy, gdy zostanie spełniony co najmniej jeden z tych warunków:

Jeśli żaden z tych warunków nie zostanie spełniony, zamiast dymka wyświetli się powiadomienie.

Sprawdzone metody

  • Wysyłaj powiadomienia w postaci dymków tylko wtedy, gdy są one ważne, np. gdy użytkownik jest częścią trwającej komunikacji lub użytkownik wyraźnie poprosił o udostępnienie treści. Dymki zajmują miejsce na ekranie i zakrywają inne treści w aplikacji.
  • Upewnij się, że powiadomienia w postaci dymków działają jak zwykłe powiadomienia. Gdy użytkownik wyłączy dymek, pojawi się powiadomienie w postaci dymka.
  • Zadbaj o to, aby funkcje były jak najbardziej precyzyjne i łatwe w obsłudze. Procesy uruchamiane z dymka, takie jak działania i okna, pojawiają się w kontenerze dymków. Oznacza to, że dymek może mieć stos zadań. Sprawa może się komplikować, jeśli w dymku jest wiele funkcji lub opcji nawigacji.
  • Wywołaj super.onBackPressed przy zastąpieniu onBackPressed w aktywności dymka. W przeciwnym razie dymek może nie działać prawidłowo.

Gdy zwinięty dymek otrzyma zaktualizowaną wiadomość, pojawi się w nim ikona plakietki wskazującej nieprzeczytaną wiadomość. Gdy użytkownik otworzy wiadomość w powiązanej aplikacji, wykonaj te czynności:

Przykładowa aplikacja

Przykładowa aplikacja Osoby to prosta aplikacja do rozmów, która korzysta z dymków. Do celów demonstracyjnych aplikacja używa czatbotów. W rzeczywistych zastosowaniach dymków można używać wyłącznie do wyświetlania wiadomości przez ludzi, a nie boty.