Dzięki dymkom z powiadomieniami użytkownicy mogą łatwiej zobaczyć rozmowy i w nich uczestniczyć.
Pływają one nad treścią innych aplikacji. Użytkownicy mogą je rozwijać, aby wyświetlić treść aplikacji i wejść z nią w interakcję, a także zwijać, gdy nie są używane.
Gdy urządzenie jest zablokowane lub aktywny jest zawsze aktywny wyświetlacz, dymki pojawiają się tak jak zwykłe powiadomienia.
Dymki z powiadomieniami są włączane przez użytkownika. Może to zrobić, klikając przycisk dymka w powiadomieniach, które obsługują dymki. Dzięki temu dany czat będzie zawsze wyświetlany w dymku. W ustawieniach użytkownicy mogą dostosować, które czaty mają być wyświetlane w dymkach, lub zmodyfikować ustawienia całej aplikacji.
Użytkownicy mogą:
- zablokować wszystkie dymki z powiadomieniami z Twojej aplikacji. Powiadomienia nie są blokowane, ale nigdy nie pojawiają się jako dymki;
- zezwalaj na wybrane dymki z powiadomieniami z Twojej aplikacji. Powiadomienia, które są wyświetlane w dymkach za pomocą przycisku dymka, są „wybrane”;
- zezwalaj na wszystkie dymki z powiadomieniami z Twojej aplikacji. Wszystkie powiadomienia wysyłane za pomocą
BubbleMetadatasą wyświetlane jako dymki.
Notification Bubble API
Dymki z powiadomieniami są tworzone za pomocą interfejsu Notification API. Jeśli chcesz, aby powiadomienie było wyświetlane jako dymek, dołącz do niego dodatkowe dane.
Widok rozwinięty dymka jest tworzony na podstawie wybranej przez Ciebie aktywności. Skonfiguruj aktywność tak, aby była prawidłowo wyświetlana jako dymek. Aktywność musi być możliwa do zmiany rozmiaru i osadzona. Jeśli nie spełnia któregokolwiek z tych wymagań, system wyświetla ją jako powiadomienie.
Poniższy kod pokazuje, jak zaimplementować 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 Twoja aplikacja wyświetla wiele dymków tego samego typu, np. kilka rozmów na czacie z różnymi osobami, 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 wyraźnie ustawisz
documentLaunchMode na
"always". Od Androida 11 nie musisz wyraźnie ustawiać tej wartości, ponieważ system automatycznie ustawia
wszystkich rozmów
documentLaunchMode na "always".
Aby wysłać dymek z powiadomieniem, 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 Androida 11 (poziom API 30) lub nowszego, upewnij się, że metadane dymka lub powiadomienie odwołują się do skrótu udostępniania.
- Zmodyfikuj aplikację tak, aby nie anulowała powiadomień wyświetlanych jako dymki. Anulowanie powiadomienia powoduje usunięcie dymka z ekranu. Otwarcie dymka automatycznie ukrywa powiązane z nim powiadomienie.
Te czynności są pokazane w tym przykładzie:
// 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(context, 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)
Jeśli aplikacja działa na pierwszym planie, gdy wysyłany jest dymek, poziom ważności jest ignorowany, a dymek jest zawsze wyświetlany, chyba że użytkownik zablokuje dymki lub powiadomienia z Twojej 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 dymka, np. kliknie przycisk, aby rozpocząć nowy czat. W takim przypadku warto też pominąć początkowe powiadomienie wysyłane podczas tworzenia dymka.
Możesz użyć metod, aby ustawić flagi, 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:
val bubbleMetadata = Notification.BubbleMetadata.Builder()
.setDesiredHeight(600)
.setIntent(bubbleIntent)
.setAutoExpandBubble(true)
.setSuppressNotification(true)
.build()
Cykl życia treści dymka
Gdy dymek jest rozwinięty, aktywność treści przechodzi normalny cykl życia procesu, co powoduje, że aplikacja staje się procesem na pierwszym planie, jeśli jeszcze nim nie jest.
Gdy dymek jest zwinięty lub zamknięty, aktywność jest niszczona. W zależności od tego, czy aplikacja ma inne komponenty działające na pierwszym planie, może to spowodować, że proces zostanie zapisany w pamięci podręcznej, a następnie zakończony.
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 (poziom API 30) 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 (poziom API 29) lub starszego, powiadomienie jest wyświetlane jako dymek tylko wtedy, gdy spełniony jest co najmniej 1 z tych warunków:
- Powiadomienie używa
MessagingStylei ma dodanąPerson. - Powiadomienie pochodzi z wywołania
Service.startForeground, macategoryustawioną naCATEGORY_CALLi ma dodanąPerson. - Gdy wysyłane jest powiadomienie, aplikacja działa na pierwszym planie.
Jeśli żaden z tych warunków nie jest spełniony, zamiast dymka wyświetlane jest powiadomienie.
Uruchamianie aktywności z dymków
Gdy dymek uruchamia nową aktywność, nowa aktywność jest uruchamiana w tym samym zadaniu i 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żyj 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ć z nią powiązane. Ponadto uruchamianie aktywności w dymku zwiększa stos zadań dymka i może utrudnić korzystanie z aplikacji, zwłaszcza w zakresie nawigacji.
Sprawdzone metody
- Wysyłaj powiadomienie jako dymek tylko wtedy, gdy jest ono ważne, np. gdy jest częścią trwającej komunikacji lub gdy użytkownik wyraźnie poprosi o dymek z treścią. Dymki zajmują miejsce na ekranie i zasłaniają treść innych aplikacji.
- 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 elementu kompozycyjnego
BackHandleri powiąż jego parametrenabledze stanem interfejsu , aby przechwytywał naciśnięcia przycisku Wstecz tylko wtedy, gdy jest to konieczne. Gdy moduł obsługi się wyłączy, dymek zostanie zwinięty.
Gdy zwinięty dymek otrzyma zaktualizowaną wiadomość, wyświetli ikonę plakietki wskazującą nieprzeczytaną wiadomość. Gdy użytkownik otworzy wiadomość w powiązanej aplikacji, wykonaj te czynności:
- Zaktualizuj
BubbleMetadata, aby pominąć powiadomienie. WywołajBubbleMetadata.Builder.setSuppressNotification(). Spowoduje to usunięcie ikony plakietki, która wskazuje, że użytkownik wszedł w interakcję z wiadomością. - Ustaw
Notification.Builder.setOnlyAlertOnce()natrue, aby pominąć dźwięk lub wibracje towarzysząceBubbleMetadataaktualizacji.
Przykładowa aplikacja
Przykładowa aplikacja SociaLite to aplikacja do rozmów, która używa dymków. Na potrzeby demonstracji ta aplikacja używa chatbotów. W rzeczywistych aplikacjach używaj dymków do wiadomości od ludzi.