Bubbles w Androidzie — rewolucja czy ewolucja?

Jest to cykl artykułów poświęcony Androidowi Q. Wszystkie artykuły znajdziesz na tej stronie.

Z bąbelkami w Androidzie na pewno już się spotkałeś. Pływające powiadomienia nie są nową koncepcją, ponieważ od dawna są dostępne w aplikacjach, takich jak Facebook Messenger. Jednak wcześniej to deweloper był odpowiedzialny za zaprojektowanie i wdrożenie własnych powiadomień bąbelkowych.

W Androidzie Q Google wprowadza Bubble API. Czyli bąbelki, które mogą zawierać przydatne informacje o zdarzeniach, które pochodzą z Twojej aplikacji. Oprócz tego pozwalają użytkownikowi na interakcję z Twoją aplikacją, nawet gdy przegląda inne aplikacje lub znajduje się w innej części systemu.

W tym artykule dowiesz się, co musisz wiedzieć o nowej funkcji Androida Q, o zaletach i ograniczeniach, o których musisz wiedzieć, zanim zaczniesz wdrażać bąbelkowe powiadomienia we własnych projektach.

Czym są bąbelki?

Pęcherzyki, czyli bubbles w Androidzie wyświetlają część zawartości aplikacji w oknie, które unosi się nad istniejącą aktywnością na pierwszym planie. Można je porównać do dialogów, ale o większych możliwościachi. Dzięki temu użytkownicy mogą łatwo wykonywać zadania z dowolnego miejsca na swoim urządzeniu. Zostały zaprojektowane jako alternatywa dla używania SYSTEM_ALERT_WINDOW.

Uzupełnij wiedzę o: Pływające okna w Androidzie

Jak działają bubbles w Androidzie?

Bąbelki są wbudowane w system powiadomień. Unoszą się nad innymi treściami i podążają za użytkownikiem, gdziekolwiek się znajdują. Pęcherzyki można rozwinąć, aby wyświetlić informacje. Można je zwinąć lub usunąć, gdy nie są już potrzebne. Gdy urządzenie jest zablokowane lub użytkownik zablokował bąbelki, pojawiają się tak, jak normalnie powiadomienia. Bąbelki układają się wzdłuż krawędzi ekranu. Nie ma możliwości umieszczenia bańki na środku ekranu w porównaniu do pływających okienek.

W stanie zwiniętym powiadomienie bąbelkowe jest reprezentowane przez małą ikonę. Te ikony są domyślnie białe, ale można je dostosować za pomocą obrazu, na przykład możesz użyć ikony aplikacji lub awatara osoby powiązanej z tym powiadomieniem.

Gdy użytkownik dotknie zwiniętej bańki, zostanie wywołana intencja, a następnie wyświetlone okno, które zawiera aktywność. Użytkownicy mogą wchodzić w interakcje z bańką (okna) bez konieczności opuszczania bieżącej aktywności, co sprawia, że pęcherzyk to skuteczny sposób na ponowne zaangażowanie użytkowników i potencjalne przyciągnięcie ich uwagi z powrotem do Twojej aplikacji.

Bubbles w Androidzie

Jakie są ograniczenia?

Pęcherzyki są wyświetlane nad treściami, które użytkownik aktualnie przegląda. Jeśli Twoja aplikacja generuje dużą liczbę bąbelków lub tworzy niepotrzebne powiadomienia, użytkownicy szybko stracą cierpliwość i mogą wyłączyć wszystkie powiadomienia lub same bąbelki.

Powiadomienia bąbelkowe będą wyświetlane tylko wtedy, gdy spełniają co najmniej jedno z następujących kryteriów:

  • Powiadomienie korzysta z MessagingStyle i ma dodaną osobę (Person). Jeśli z powiadomieniem powiązanych jest wiele osób, musisz także oznaczyć tę rozmowę jako grupę, używając setGroupConversation(true).
  • Powiadomienie jest wywołane z Service.startForeground, posiada kategorię z CATEGORY_CALL oraz osobę.
  • Aplikacja jest na pierwszym planie, gdy wysyłane jest powiadomienie

Jeśli żaden z tych warunków nie zostanie spełnione lub urządzenie jest zablokowane, Twoje bąbelki będą wyświetlane jako standardowe powiadomienie.

info:

Uwaga! Funkcja bąbelki działa, wtedy gdy jest włączona opcja Bubbles w ustawieniach programisty. Domyślnie pęcherzyki są wyłączone.

Set Bubbles in Debeloper Options - Android

Jak wdrożyć bąbelki w swojej aplikacji?

Pęcherzyki są tworzone za pośrednictwem interfejsu API powiadomień. Aby wysłać bąbelek, wykonaj następujące kroki:

  1. Utwórz powiadomienie.
  2. Wywołaj Notification.BubbleMetadata.Builder w celu utworzenia obiektu BubbleMetadata.
  3. Użyj, setBubbleMetadata, aby dodać metadane do powiadomienia.
  4. Stwórz aktywność, która będzie wyświetlać zawartość pęcherzyka.

Utwórz powiadomienie

W systemie Android 8.0 wprowadzono koncepcję kanałów powiadomień, w których wszystkie powiadomienia wysyłane do tego samego kanału zachowują się tak samo. Aby utworzyć kanał powiadomień, musisz zbudować obiekt NotificationChannel i przekazać:

  • Identyfikator, który musi być unikalny dla twojego pakietu.
  • Nazwę kanału, która będzie wyświetlana użytkownikowi na ekranie.
  • Określić poziom ważności kanału, które jest stosowane dla każdego powiadomienia wysłanego do tego kanału. Powiadomienia bąbelkowe muszą mieć przypisany poziom IMPORTANCE_HIGH.

Android Q wprowadza również metodę setAllowBubbles(), która pozwala określić, że ten kanał obsługuje bąbelki. Wartość przypisana zostanie zignorowana dla kanałów o poziomie ważności IMPORTANCE_DEFAULT lub niższym, więc musisz oznaczyć swój kanał jako setAllowBubbles(true) i IMPORTANCE_HIGH. Jeśli Twoja aplikacja znajduje się na pierwszym planie, gdy wysyłany jest bąbelek, ważność jest ignorowana, a bąbelek będzie zawsze wyświetlany (chyba że użytkownik zablokował bąbelki lub powiadomienia z Twojej aplikacji).

val channel = NotificationChannel(
    CHANNEL_ID,
    CHANNEL_NAME,
    NotificationManager.IMPORTANCE_HIGH)
    .apply {
        description = CHANNEL_DESCRIPTION
        setAllowBubbles(true)
    }

val notificationManager = getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)

Warto wspomnieć, że klasa NotificationChannel posiada metodę canBubble() – pozwala sprawdzić, czy nasza aplikacja może korzystać z bąbelkowych powiadomień. Dzieje się tak dlatego, że użytkownicy mogą wyłączyć bąbelki powiadomień w sekcji ustawień systemowych aplikacji. Warto z tej metody skorzystać przed wysłaniem pechęrzyka.

Utwórz bąbelek

Tworzenie samego bubbles w Androidzie jest dość proste. W pierwszej kolejności musimy okreslić co ma się wyświetlić po rozwinięciu bąbelka. Czyli określamy jaką aktywność wyświetlić. W tym celu korzystamy z PendingIntent.

Następnie należy utworzyć obiekt BubbleMetadata, który będzie zawierał wszystkie dane wymagane do wyświetlenia bąbelkowego powiadomienia. Aby utworzyć obiekt BubbleMetadata, należy wywołać konstruktor Notification.BubbleMetadata.Builder i przekazać kilka argumentów:

  • setIntent() – aby określić cel zamiaru bąbla docelowego, który będzie uruchamiany za każdym razem, gdy użytkownik wejdzie w interakcję z tym bąbelkiem.
  • setDeleteIntent() – przypisujemy intencję, która powinna zostać wykonana, gdy użytkownik usunie pęcherzyk.
  • setIcon() – ikona, która będzie reprezentować bańkę w zwiniętym stanie. Kształt ikony jest adaptacyjny i można go modyfikować w celu dopasowania do motywu urządzenia. Jeśli Twoja ikona jest oparta na bitmapach, musisz użyć createWithAdaptiveBitmap.
  • setDesiredHeight() – wysokość zawartości okna wyświetlanego po rozwinięciu bąbla, chociaż ta wartość zostanie zignorowana, gdy nie będzie wystarczającej ilości miejsca na ekranie.
  • setAutoExpandBubble() – deklarujemy, czy zawartość bąbelków zostanie automatycznie rozwinięta podczas ich tworzenia, pod warunkiem, że wywołująca aplikacja znajduje się na pierwszym planie.
  • setSuppressNotification() – czy powiadomienie powinno być wyświetlane na pasku systemowym. Pod warunkiem, że aplikacja wywołująca powiadomienie jest na pierwszym planie.

Oczywiście nie wszystkie argumenty są obowiązkowe.

val bubbleData = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_foreground))
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(false)
    .build()

Połącz wszystko i zaktualizuj manifest

Teraz gdy już mamy przygotowany kanał oraz bąbelek. Musimy połączyć te dwie rzeczy. Możemy zrobić to w następujący sposób:

val builder = Notification.Builder(this, CHANNEL_ID)
    .setContentTitle("New post on MYENV!")
    .setContentText("Click to open new post on MYENV")
    .setContentIntent(bubbleIntent)
    .setSmallIcon(R.drawable.ic_launcher_foreground)
    .setBubbleMetadata(bubbleData)
    .setAutoCancel(true)
    .build()

val notificationManager = NotificationManagerCompat.from(this)
notificationManager.notify(100, builder)

Teraz wystarczy, że stworzyć drugą aktywność, która będzie wyświetlała zawartość bąbelka. Możesz umieścić tam wiele rzeczy. Możesz zbudować czat lub listę nowych wiadomości na MYENV za pomocą RecyclerView 🙂

A jeżeli chcesz wiedzieć więcej na temat RecyclerView zajrzyj na tą stronę.

Gdy już mamy gotową aktywność, którą będziesz wyświetlał w bubbles musisz dodać następujące atrybuty dla tej aktywności w AndroidManifest.xml

<activity
    android:name=".BubbleActivity"
    android:allowEmbedded="true"
    android:documentLaunchMode="always"
    android:resizeableActivity="true">
</activity>

Poszczególne atrybuty oznaczają:

  • allowEmbedded — pęcherzyki są wyświetlane w kontenerze należącym do innej aktywności, więc musimy zadeklarować, że BubbleAtivity można uruchomić jako osadzone dziecko innej aktywności.
  • documentLaunchMode — czasami aplikacja może wymagać wyświetlenia wielu bąbelków tego samego typu. Na przykład w wiadomościach sms, czatach. Istnieje możliwość, że użytkownik otrzyma jednocześnie wiele wiadomości od różnych osób w tym samym kanale powiadomień. Jeśli chcesz, aby aplikacja wyświetlała wiele bąbelków tego samego typu, musi mieć możliwość uruchamiania wielu instancji. Z drugiej strony możesz tworzyć osobny kanał dla każdej osoby.
  • resizeableActivity — określa, czy aplikacja obsługuje wyświetlanie wielu okien.

Bąbelki w Androidzie

Bubbles w Androidzie. Czy warto?

Bąbelki są stałą częścią interfejsu użytkownika systemu Android (UI), mogą stanowić wygodne miejsce do przechowywania notatek lub zarządzania bieżącymi zadaniami. Można je użyć także do przypomnień. Czy są rewolucyjne? Raczej nie, zwłaszcza patrząc na ograniczenia. Google chwali się tą funkcja, ale jest tylko dostępna dla wybranych :/ Czy warto wdrażać bąbelki w swoich projektach? Myślę, że tak, ale też nie ma co się spieszyć. A Ty co sądzisz o bąbelkach?

Google przygotowało bardzo fajny przykład, demonstrujący bąbelki w Androidzie. Projekt możesz znaleźć w serwisie Github.

Co dalej?

  • Polub stronę MYENV na Facebooku oraz śledź mnie na Twitterze
  • Zachęcam do komentowania i pisania propozycji tematów, o których chcesz przeczytać
  • Poleć ten wpis za pomocą poniższych przycisków. Będę Ci za to bardzo wdzięczny 🙂
  • Życzę Ci miłego dnia i miłego kodowania 🙂