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 odkrywać zawartość aplikacji, i wchodzić z nią w interakcję, a gdy nie są używane, można je zwinąć.

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 przy użyciu interfejsu 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 dymka:

<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.

Uruchamianie działań z dymków

Gdy dymek uruchomi nową aktywność, zostanie ona uruchomiona w ramach tego samego zadania i w tym samym oknie lub jako nowe zadanie na pełnym ekranie – zwinie dymek, od którego ono się uruchomiło.

Aby uruchomić nowe działanie w ramach tego samego zadania co dymek: 1. używać kontekstu aktywności przy uruchamianiu intencji: activity.startActivity(intent) i 1. Nie ustawiaj flagi FLAG_ACTIVITY_NEW_TASK intencji.

W przeciwnym razie nowe działanie rozpocznie się w nowym zadaniu, a dymek zostanie zwinięty.

Pamiętaj, że dymek reprezentuje konkretną rozmowę, więc działania uruchamiane w dymku powinny być z nią związane. Ponadto uruchomienie działania w bąbelku zwiększa stos zadań dymku i może utrudnić obsługę użytkowników, szczególnie podczas korzystania z nawigacji.

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.
  • 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 aplikacja do rozmów, która korzysta z dymków. Do celów demonstracyjnych aplikacja używa czatbotów. W rzeczywistych zastosowaniach używaj dymków do wyświetlania wiadomości od ludzi.