Dymki powiadomień ułatwiają użytkownikom przeglądanie rozmów i uczestniczenie w nich.
Pływają 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. Aby to zrobić, kliknij 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 dymka, są „wybrane”.
- Zezwól na wszystkie dymki z powiadomieniami z aplikacji. Wszystkie powiadomienia wysyłane za pomocą
BubbleMetadatabę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 rozmiaru i osadzone. Jeśli nie spełnia jednego 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 wyraźnie 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:
- 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 interfejsu API 30) lub nowszego, upewnij się, że metadane dymku lub powiadomienia odwołują się do skrótu do udostępniania.
- Zmodyfikuj aplikację, aby nie anulowała powiadomień, które pojawiają się jako dymki. Anulowanie powiadomienia powoduje usunięcie dymka z ekranu. Otwarcie dymka automatycznie ukrywa powiązane z nim powiadomienie.
Te kroki pokazano 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 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() 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ść 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, a następnie jego zakończenie, 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 (poziom API 30) lub nowszego, powiadomienie nie wyświetla się jako dymek, chyba że spełnia wymagania dotyczące konwersacji. 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 jeden z tych warunków:
- Powiadomienie korzysta z
MessagingStylei ma dodany elementPerson. - Powiadomienie dotyczy połączenia z numerem
Service.startForeground, macategoryo wartościCATEGORY_CALLi 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)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 formie dymka 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.
- Użyj komponentu
BackHandleri powiąż jego parametrenabledze stanem interfejsu, aby przechwytywał naciśnięcia przycisku Wstecz tylko wtedy, gdy jest to konieczne. Gdy Twój moduł obsługi wyłączy się, dymek zniknie.
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:
- 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 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 rozmów, która korzysta z dymków. Ta aplikacja wykorzystuje chatboty w celach demonstracyjnych. W rzeczywistych zastosowaniach używaj dymków do wiadomości od ludzi.