Dymki ułatwiają użytkownikom wyświetlanie rozmów i uczestniczenie w nich.
Dymki są wbudowane w system powiadomień. Pływają one nad treściami innych aplikacji i podążają za użytkownikiem, gdziekolwiek się on przemieści. Użytkownicy mogą rozwijać dymki, aby wyświetlać treści aplikacji i wchodzić z nimi w interakcję, a także zwijać je, gdy nie są używane.
Gdy urządzenie jest zablokowane lub zawsze aktywny wyświetlacz jest włączony, dymki pojawiają się jako zwykłe powiadomienia.
Dymki są funkcją, z której można zrezygnować. Gdy aplikacja wyświetli pierwszy dymek, w oknie z prośbą o uprawnienia pojawią się 2 opcje:
- Zablokuj 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 za pomocą
BubbleMetaData
będą wyświetlane jako dymki.
Interfejs Bubble API
Dymki są tworzone za pomocą interfejsu Notification API, więc wysyłaj powiadomienia 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ść tak, aby była prawidłowo wyświetlana jako dymek. Działanie musi być możliwe do zmiany rozmiaru i osadzone. Jeśli nie spełnia żadnego z tych wymagań, wyświetla się 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. kilka 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, wykonaj te czynności:
- Utwórz powiadomienie w zwykły sposób.
- Wywołaj
BubbleMetadata.Builder(PendingIntent, Icon)
lubBubbleMetadata.Builder(String)
, aby utworzyć obiektBubbleMetadata
. - Użyj
setBubbleMetadata()
aby dodać metadane do powiadomienia. - 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 udostępniania.
- 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 się on wyświetla, chyba że użytkownik zablokuje dymki lub powiadomienia z aplikacji.
Tworzenie rozwiniętego dymku
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. kliknie 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()
i 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, 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 konwersacji. 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:
- Powiadomienie używa symbolu
MessagingStyle
i ma dodany symbolPerson
. - Powiadomienie dotyczy połączenia z numerem
Service.startForeground
, macategory
CATEGORY_CALL
i zawiera dodanyPerson
. - Aplikacja działa na pierwszym planie, gdy wysyłane jest powiadomienie.
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ść, 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)
i
1. Nie ustawiaj flagi FLAG_ACTIVITY_NEW_TASK
w przypadku 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 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 utrudnić 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
, gdy zastępujeszonBackPressed
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 informująca o nieprzeczytanej wiadomości. Gdy użytkownik otworzy wiadomość w powiązanej aplikacji, wykonaj te czynności:
- Zaktualizuj
BubbleMetadata
, aby wyłączyć powiadomienie. Zadzwoń pod numerBubbleMetadata.Builder.setSuppressNotification()
. Spowoduje to usunięcie ikony plakietki, aby wskazać, że użytkownik wykonał działanie na wiadomości. - Ustaw wartość
Notification.Builder.setOnlyAlertOnce()
natrue
, aby wyciszyć dźwięk lub wibracje towarzyszące aktualizacjiBubbleMetadata
.
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.