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

Dzięki dymkom użytkownicy mogą łatwiej zobaczyć rozmowę i brać w nich udział.

Rysunek 1. Dymek czatu.

Dymki są wbudowane w system powiadomień. Pływają one nad innymi treściami w aplikacji i obserwują użytkownika w dowolnym miejscu. Użytkownicy mogą rozwijać dymki, aby odkrywać funkcje i informacje o aplikacji. Gdy z nich nie korzystają, można je zwijać.

Gdy urządzenie jest zablokowane lub tryb Zawsze na ekranie jest aktywny, dymki wyświetlają się w zwykły sposób.

Dymki to funkcja, z której można zrezygnować. Gdy aplikacja prezentuje swój pierwszy dymek, okno uprawnień zawiera 2 opcje:

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

Dymek API

Do tworzenia dymków służy interfejs API powiadomień, więc wysyłaj je w zwykły sposób. Jeśli chcesz, aby powiadomienie wyświetlało się jako dymek, dołącz do niego dodatkowe dane.

Rozwinięty widok dymka jest tworzony na podstawie wybranej przez Ciebie aktywności. Skonfiguruj aktywność, aby wyświetlała się prawidłowo jako dymek. Aktywność musi mieć możliwość zmiany rozmiaru i umieszczenie. Jeśli brakuje żadnego z tych wymagań, zamiast tego wyświetla się jako powiadomienie.

Poniższy kod pokazuje, jak wdrożyć prosty dymek:

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

Jeśli aplikacja pokazuje wiele dymków tego samego typu, np. wiele rozmów na czacie z różnymi kontaktami, aktywność musi mieć możliwość uruchomienia wielu instancji. Na urządzeniach z Androidem 10 lub starszym powiadomienia nie są wyświetlane jako dymki, chyba że ustawisz documentLaunchMode na "always". Począwszy od Androida 11 nie musisz samodzielnie ustawiać tej wartości, ponieważ system automatycznie ustawia wartość documentLaunchMode we wszystkich rozmowach na "always".

Aby wysłać dymek, wykonaj następujące 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 dymka lub powiadomienie odwołują się do skrótu do udostępniania.

Oto przykład:

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 momencie wysłania dymka aplikacja jest na pierwszym planie, ważność jest ignorowana, a dymek jest zawsze wyświetlany, chyba że użytkownik zablokuje dymki lub powiadomienia z aplikacji.

Utwórz rozwinięty dymek

Dymek możesz skonfigurować tak, aby automatycznie wyświetlał się w stanie rozwiniętym. Zalecamy korzystanie z tej funkcji tylko wtedy, gdy użytkownik wykona działanie, które spowoduje wyświetlenie dymka, np. kliknie przycisk, aby rozpocząć nowy czat. W takim przypadku korzystne jest też wstrzymanie początkowego powiadomienia wysyłanego po utworzeniu dymka.

Istnieją metody, które pozwalają ustawić flagi włączające te zachowania: setAutoExpandBubble() i setSuppressNotification().

Poniższy przykład pokazuje, jak skonfigurować dymek, żeby 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 dymkowych

Po rozwinięciu dymka aktywność związana z treścią przechodzi przez zwykły cykl życia procesu. W rezultacie aplikacja staje się procesem na pierwszym planie, jeśli jeszcze tego nie robi.

Gdy dymek zostanie zwinięty lub zamknięty, aktywność zostanie niszczona. W zależności od tego, czy aplikacja ma uruchomione inne komponenty na pierwszym planie, może to spowodować zapisanie tego procesu w pamięci podręcznej, a następnie jego zakończenie.

Kiedy pojawiają się dymki

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

Jeśli aplikacja jest kierowana na Androida 11 lub nowszego, powiadomienie nie jest wyświetlane jako dymek, chyba że spełnia wymagania dotyczące rozmowy. Jeśli aplikacja jest kierowana na Androida 10 lub starszego, powiadomienie wyświetla się jako dymek tylko wtedy, gdy spełniony jest co najmniej jeden z tych warunków:

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

Sprawdzone metody

  • Powiadomienia wysyłaj jako dymek tylko wtedy, gdy są ważne, np. gdy są częścią trwającej komunikacji lub gdy użytkownik wyraźnie prosi o udostępnienie treści w formie dymka. Dymki zajmują miejsce na ekranie i zakrywają inną zawartość aplikacji.
  • Sprawdź, czy powiadomienie z dymkiem działa jak zwykłe powiadomienie. Gdy użytkownik wyłączy dymek, pojawi się ono jako zwykłe powiadomienie.
  • Funkcje powinny być jak najwęższe i jak najbardziej konkretne. 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ń. Sprawy się komplikują, jeśli w dymku jest dużo funkcji lub nawigacji.
  • Wywołaj super.onBackPressed przy zastępowaniu 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 oznaczają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 używamy czatbotów. W rzeczywistych aplikacjach dymki mogą być używane tylko do wysyłania wiadomości przez ludzi, a nie boty.