Używanie dymków powiadomień w rozmowach

Dymki powiadomień ułatwiają użytkownikom śledzenie rozmów i uczestniczenie w nich.

Rysunek 1. Dymek czatu.

Pojawiają się one na wierzchu innych treści aplikacji, a użytkownicy mogą je rozwijać, aby wyświetlać treści aplikacji i wchodzić z nimi w interakcję, oraz zwijać, gdy ich nie używają.

Gdy urządzenie jest zablokowane lub zawsze aktywny wyświetlacz jest włączony, dymki pojawiają się jako zwykłe powiadomienia.

Dymki z powiadomieniami są włączone przez użytkownika. Można to zrobić, klikając przycisk dymka w powiadomieniach, które obsługują dymki. Dzięki temu dany czat będzie zawsze wyświetlany na pierwszym planie. W ustawieniach użytkownicy mogą dostosować, które czaty mają być wyświetlane w dymkach, lub zmodyfikować ustawienia całej aplikacji.

Użytkownicy mogą:

  • Blokowanie wszystkich dymków powiadomień z aplikacji. Powiadomienia nie są blokowane, ale nigdy nie pojawiają się jako dymki.
  • Zezwól na wybrane dymki z powiadomieniami z aplikacji. Dymki z powiadomieniami, które są używane za pomocą przycisku dymku, są „wybrane”.
  • Zezwól na wszystkie dymki z powiadomieniami z aplikacji. Wszystkie powiadomienia wysyłane za pomocą BubbleMetadata będą wyświetlane jako dymki.

Notification Bubble API

Dymki powiadomień są tworzone za pomocą interfejsu Notification API. Jeśli chcesz, aby powiadomienie wyświetlało się jako dymek, dołącz do niego dodatkowe dane.

Rozwinięty widok dymku jest tworzony na podstawie wybranej aktywności. Skonfiguruj aktywność tak, aby była prawidłowo wyświetlana jako dymek. Działanie musi być możliwe do zmiany rozmiaruosadzone. Jeśli nie spełnia on żadnego z tych wymagań, system wyświetli go jako powiadomienie.

Poniższy kod pokazuje, jak wdrożyć 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 wyświetla wiele dymków tego samego typu, np. wiele rozmów na czacie z różnymi kontaktami, aktywność musi mieć możliwość uruchamiania wielu instancji. Na urządzeniach z Androidem 10 lub starszym powiadomienia nie są wyświetlane jako dymki, chyba że jawnie ustawisz documentLaunchMode na "always". Od Androida 11 nie musisz jawnie ustawiać tej wartości, ponieważ system automatycznie ustawia wszystkie rozmowy na documentLaunchMode"always".

Aby wysłać dymek z powiadomieniem, 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 reklamy na urządzenia z Androidem 11 lub nowszym, upewnij się, że metadane dymka lub powiadomienie odwołują się do skrótu do udostępnienia.
  5. Zmodyfikuj aplikację, aby nie anulowała powiadomień wyświetlanych jako dymki. Aby sprawdzić, czy aktywność powiadomienia została uruchomiona jako dymek, wywołaj Activity#isLaunchedFromBubble(). Anulowanie powiadomienia powoduje usunięcie dymka z ekranu. Otwarcie dymka automatycznie ukrywa powiązane z nim powiadomienie.

Te kroki pokazano 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 aplikacja jest na pierwszym planie, gdy wysyłany jest dymek, jego ważność jest ignorowana i zawsze jest on wyświetlany, chyba że użytkownik zablokuje dymki lub powiadomienia z aplikacji.

Tworzenie rozwiniętego dymka

Możesz skonfigurować dymek tak, aby automatycznie wyświetlał się w stanie rozwiniętym. Zalecamy używanie tej funkcji tylko wtedy, gdy użytkownik wykona działanie, które spowoduje wyświetlenie dymku, np. naciśnie przycisk, aby rozpocząć nowy czat. W takim przypadku warto też pominąć początkowe powiadomienie wysyłane po utworzeniu dymka.

Istnieją metody ustawiania flag, które włączają te zachowania:setAutoExpandBubble()setSuppressNotification().

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

Gdy dymek jest rozwinięty, aktywność treści przechodzi normalny cykl życia procesu, w wyniku czego aplikacja staje się procesem na pierwszym planie, jeśli jeszcze nim nie jest.

Gdy dymek jest zwinięty lub zamknięty, aktywność jest niszczona. Może to spowodować zapisanie procesu w pamięci podręcznej i późniejsze jego zamknięcie, w zależności od tego, czy aplikacja ma inne komponenty działające na pierwszym planie.

Kiedy pojawiają się dymki

Aby nie zakłócać pracy użytkownikom, dymki pojawiają się tylko w określonych okolicznościach.

Jeśli aplikacja jest kierowana na Androida 11 lub nowszego, powiadomienie nie wyświetla się jako dymek, chyba że spełnia wymagania dotyczące rozmów. Jeśli aplikacja jest przeznaczona na Androida 10 lub starszego, powiadomienie pojawi 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 dymku wyświetli się powiadomienie.

wyszukać „dymki” w menu Ustawienia i włączyć ustawienia dymków.

Uruchamianie aktywności z dymków

Gdy dymek uruchamia nową aktywność, może ona zostać uruchomiona w ramach tego samego zadania i tego samego okna dymka lub w nowym zadaniu na pełnym ekranie, co spowoduje zwinięcie dymka, który ją uruchomił.

Aby uruchomić nową aktywność w tym samym zadaniu co dymek:1. Używaj kontekstu aktywności podczas uruchamiania intencji,activity.startActivity(intent)iactivity.startActivity(intent)1. Nie ustawiaj flagi FLAG_ACTIVITY_NEW_TASK w przypadku intencji.

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

Pamiętaj, że dymek reprezentuje konkretną rozmowę, więc działania uruchamiane w jego obrębie powinny być z nią powiązane. Dodatkowo uruchomienie aktywności w dymku zwiększa stos zadań dymku i może potencjalnie skomplikować korzystanie z aplikacji, zwłaszcza w zakresie nawigacji.

Sprawdzone metody

  • Wysyłaj powiadomienia w formie dymków tylko wtedy, gdy są ważne, np. gdy są częścią trwającej komunikacji lub gdy użytkownik wyraźnie poprosi o wyświetlenie treści w dymku. Dymki zajmują miejsce na ekranie i zasłaniają zawartość innych aplikacji.
  • Upewnij się, że powiadomienie w dymku działa też jako zwykłe powiadomienie. Gdy użytkownik wyłączy dymek, powiadomienie w formie dymka będzie wyświetlane jako zwykłe powiadomienie.
  • Wywołaj super.onBackPressed podczas zastępowania onBackPressed w aktywności w dymku. W przeciwnym razie dymek może nie działać prawidłowo.

Gdy zwinięty dymek otrzyma zaktualizowaną wiadomość, pojawi się na nim ikona powiadomienia o nieprzeczytanej wiadomości. Gdy użytkownik otworzy wiadomość w powiązanej aplikacji, wykonaj te czynności:

Przykładowa aplikacja

Przykładowa aplikacja SociaLite to aplikacja do prowadzenia rozmów, która korzysta z dymków. W celach demonstracyjnych ta aplikacja korzysta z chatbotów. W rzeczywistych zastosowaniach używaj dymków do wiadomości od ludzi.