Używanie dymków powiadomień w rozmowach

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

Rysunek 1. Dymek czatu.

Unoszą się nad innymi treściami aplikacji, a użytkownicy mogą je rozwijać, aby wyświetlać treści aplikacji i wchodzić z nimi w interakcje, oraz zwijać, gdy ich nie używają.

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

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

Użytkownicy mogą:

  • Zablokuj wszystkie dymki z powiadomieniami z aplikacji. Powiadomienia nie są blokowane, ale nigdy nie pojawiają się jako dymki.
  • Zezwalaj na wybrane dymki z powiadomieniami z aplikacji. Dymki z powiadomieniami utworzone za pomocą przycisku dymka są „wybrane”.
  • Zezwalaj na wszystkie dymki z powiadomieniami z aplikacji. Wszystkie powiadomienia wysyłane za pomocą BubbleMetadata będą wyświetlane jako dymki.

Interfejs API dymka z powiadomieniem

Dymki z powiadomieniami są tworzone za pomocą interfejsu API powiadomień. 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 prawidłowo wyświetlała się jako dymek. Aktywność musi być osadzona i musi umożliwiać zmianę rozmiaru. Jeśli nie spełnia tych wymagań, system wyświetla 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 kilka dymków tego samego typu, np. kilka rozmów na czacie z różnymi kontaktami, aktywność musi umożliwiać uruchamianie wielu instancji. Na urządzeniach z Androidem 10 lub starszym powiadomienia nie są wyświetlane jako dymki, chyba że wyraźnie ustawisz documentLaunchMode na "always". Począwszy od Androida 11, nie musisz jawnie ustawiać tej wartości, ponieważ system automatycznie ustawia wartość documentLaunchMode wszystkich rozmów na "always".

Aby wysłać dymek z powiadomieniem:

  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 aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, upewnij się, że metadane dymku lub powiadomienie odwołują się do skrótu udostępniania.
  5. Zmodyfikuj aplikację, aby nie anulowała powiadomień, które pojawiają się jako dymki. Anulowanie powiadomienia powoduje usunięcie dymka z ekranu. Otwarcie dymku powoduje automatyczne ukrycie powiązanego z nim powiadomienia.

Te kroki są przedstawione w tym przykładzie:

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* 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 =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.chat)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

Jeśli aplikacja działa na pierwszym planie, gdy wysyłany jest dymek, ważność jest ignorowana i dymek jest zawsze 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 korzystanie z tej funkcji tylko wtedy, gdy użytkownik wykonuje działanie, które powoduje wyświetlenie dymku, np. klika przycisk, aby rozpocząć nowy czat. W takim przypadku warto też wyłączyć początkowe powiadomienie wysyłane po utworzeniu dymka.

Możesz użyć metod, aby ustawić flagi, które umożliwiają te zachowania: setAutoExpandBubble() i setSuppressNotification().

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

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

Cykl życia treści w dymku

Gdy dymek jest rozwinięty, aktywność związana z treścią przechodzi przez normalny cykl życia procesu, co powoduje, że aplikacja staje się procesem na pierwszym planie, jeśli jeszcze nim nie jest.

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

Kiedy pojawiają się dymki

Aby ograniczyć zakłócenia dla użytkownika, dymki pojawiają się tylko w określonych okolicznościach.

Jeśli aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, powiadomienie nie pojawia się jako dymek, chyba że spełnia wymagania dotyczące rozmów. Jeśli aplikacja jest kierowana na Androida 10 (API na poziomie 29) lub starszego, powiadomienie pojawia się jako dymek tylko wtedy, gdy spełniony jest co najmniej 1 z tych warunków:

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

Uruchamianie aktywności z dymków

Gdy dymek uruchamia nową aktywność, uruchamia się ona w tym samym zadaniu i w tym samym oknie dymka lub w nowym zadaniu na pełnym ekranie, co powoduje zwinięcie dymka, który ją uruchomił.

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

W przeciwnym razie nowa aktywność zostanie uruchomiona w nowym zadaniu, a dymek zostanie zwinięty.

Pamiętaj, że dymek reprezentuje konkretną rozmowę, więc aktywności uruchamiane w dymku powinny być powiązane z tą rozmową. Dodatkowo uruchomienie aktywności w dymku zwiększa stos zadań dymku i może potencjalnie skomplikować obsługę, zwłaszcza w zakresie nawigacji.

Sprawdzone metody

  • Wysyłaj powiadomienia w formie dymku tylko wtedy, gdy są ważne, np. gdy są częścią trwającej komunikacji lub gdy użytkownik wyraźnie prosi o dymek z treścią. Dymki zajmują miejsce na ekranie i zasłaniają treści w innych aplikacjach.
  • Upewnij się, że powiadomienie w dymku działa też jako zwykłe powiadomienie. Gdy użytkownik wyłączy dymek, powiadomienie w dymku będzie wyświetlane jako zwykłe powiadomienie.
  • Użyj funkcji kompozycyjnej BackHandler i powiąż jej parametr enabled ze stanem interfejsu, aby przechwytywała naciśnięcia przycisku Wstecz tylko wtedy, gdy jest to konieczne. Gdy moduł obsługi zostanie wyłączony, dymek się zwinie.

Gdy w zwiniętym dymku pojawi się zaktualizowana wiadomość, wyświetli się ikona plakietki wskazująca, że wiadomość jest nieprzeczytana. Gdy użytkownik otworzy wiadomość w powiązanej aplikacji, wykonaj te czynności:

Przykładowa aplikacja

Przykładowa aplikacja SociaLite to aplikacja konwersacyjna, 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 wysyłanych przez ludzi.