Tworzenie rozwijanych powiadomień

Podstawowe powiadomienie zawiera zwykle tytuł, wiersz tekstu i działania, które użytkownik może wykonać w odpowiedzi. Aby podać więcej informacji, możesz utworzyć duże, rozwijane powiadomienia, stosując jeden z kilku szablonów powiadomień zgodnie z opisem w tym dokumencie.

Na początek utwórz powiadomienie zawierające wszystkie podstawowe treści zgodnie z opisem w sekcji Tworzenie powiadomienia. Następnie wywołaj setStyle() z obiektem stylu i podaj informacje odpowiadające każdemu szablonowi, jak pokazano w poniższych przykładach.

Dodaj duży obraz

Aby dodać obraz do powiadomienia, przekaż wystąpienie NotificationCompat.BigPictureStyle do setStyle().

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setStyle(NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setStyle(new NotificationCompat.BigPictureStyle()
               .bigPicture(myBitmap))
        .build();

Aby obraz był widoczny jako miniatura tylko po zwinięciu powiadomienia (tak jak na ilustracji poniżej), wywołaj metodę setLargeIcon() i przekaż mu obraz. Następnie wywołaj metodę BigPictureStyle.bigLargeIcon() i przekaż mu null, aby duża ikona znikała po rozwinięciu powiadomienia:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setLargeIcon(myBitmap)
        .setStyle(NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap)
                .bigLargeIcon(null))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setLargeIcon(myBitmap)
        .setStyle(new NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap)
                .bigLargeIcon(null))
        .build();
Obraz przedstawiający zwinięte powiadomienie i rozwinięte powiadomienie zawierające niebieski obraz
Rysunek 1. Powiadomienie z użyciem: NotificationCompat.BigPictureStyle.

Dodawanie dużego bloku tekstu

Zastosuj parametr NotificationCompat.BigTextStyle, aby wyświetlić tekst w rozwiniętym obszarze treści powiadomienia:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_mail)
        .setContentTitle(emailObject.getSenderName())
        .setContentText(emailObject.getSubject())
        .setLargeIcon(emailObject.getSenderAvatar())
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText(emailObject.getSubjectAndSnippet()))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_mail)
        .setContentTitle(emailObject.getSenderName())
        .setContentText(emailObject.getSubject())
        .setLargeIcon(emailObject.getSenderAvatar())
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText(emailObject.getSubjectAndSnippet()))
        .build();
Obraz przedstawiający zwinięte i rozwinięte powiadomienie w formacie BigTextStyle
Rysunek 2. Powiadomienie z użyciem: NotificationCompat.BigTextStyle.

Utwórz powiadomienie w stylu skrzynki odbiorczej

Zastosuj pole NotificationCompat.InboxStyle do powiadomienia, jeśli chcesz dodać kilka krótkich wierszy podsumowania, np. fragmenty z przychodzących e-maili. Dzięki temu zamiast jednego ciągłego wiersza tekstu podanego przez NotificationCompat.BigTextStyle możesz dodać wiele fragmentów tekstu obciętych do 1 wiersza.

Aby dodać nowy wiersz, wywołaj addLine() maksymalnie 6 razy, tak jak w tym przykładzie. Jeśli dodasz więcej niż 6 wierszy, widocznych będzie tylko 6.

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_email_24)
        .setContentTitle("5 New mails from Frank")
        .setContentText("Check them out")
        .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.logo))
        .setStyle(
                NotificationCompat.InboxStyle()
                .addLine("Re: Planning")
                .addLine("Delivery on its way")
                .addLine("Follow-up")
        )
        .build()

Java

Notification notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_email_24)
        .setContentTitle("5 New mails from Frank")
        .setContentText("Check them out")
        .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.logo))
        .setStyle(
                NotificationCompat.InboxStyle()
                .addLine("Re: Planning")
                .addLine("Delivery on its way")
                .addLine("Follow-up")
        )
        .build();

Wynik wygląda tak:

Obraz przedstawiający rozwinięte powiadomienie w stylu skrzynki odbiorczej
Rysunek 3. Rozwinięte powiadomienie w stylu skrzynki odbiorczej.

Pokazywanie rozmowy w powiadomieniu

Zastosuj filtr NotificationCompat.MessagingStyle, aby wyświetlać sekwencyjne wiadomości między dowolną liczbą osób. Jest to idealne rozwiązanie w przypadku aplikacji do obsługi wiadomości, ponieważ zapewnia spójny układ każdej wiadomości, obsługując oddzielnie nazwę nadawcy i tekst wiadomości, a każda wiadomość może mieć wiele wierszy.

Aby dodać nową wiadomość, zadzwoń pod numer addMessage(). Podaj tekst wiadomości, godzinę odbioru oraz nazwę nadawcy. Informacje te możesz też przekazać jako obiekt NotificationCompat.MessagingStyle.Message, jak w tym przykładzie:

Kotlin

val message1 = NotificationCompat.MessagingStyle.Message(
        messages[0].getText(),
        messages[0].getTime(),
        messages[0].getSender())
val message2 = NotificationCompat.MessagingStyle.Message(
        messages[1].getText(),
        messages[1].getTime(),
        messages[1].getSender())
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_message)
        .setStyle(
                NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                .addMessage(message1)
                .addMessage(message2))
        .build()

Java

NotificationCompat.MessagingStyle.Message message1 =
        new NotificationCompat.MessagingStyle.Message(messages[0].getText(),
                                                      messages[0].getTime(),
                                                      messages[0].getSender());
NotificationCompat.MessagingStyle.Message message2 =
        new NotificationCompat.MessagingStyle.Message(messages[1].getText(),
                                                      messages[1].getTime(),
                                                      messages[1].getSender());

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_message)
        .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                .addMessage(message1)
                .addMessage(message2))
        .build();
Obraz przedstawiający powiadomienie w stylu wiadomości
Rysunek 4. Powiadomienie z użyciem: NotificationCompat.MessagingStyle.

Podczas korzystania z metody NotificationCompat.MessagingStyle wszystkie wartości podane w parametrach setContentTitle() i setContentText() są ignorowane.

Zadzwoń pod numer setConversationTitle(), aby dodać tytuł wyświetlany nad rozmową. Może to być utworzona przez użytkownika nazwa grupy lub, jeśli nie ma określonej nazwy, lista uczestników rozmowy. Nie ustawiaj tytułu rozmowy w czatach indywidualnych, ponieważ system wykorzystuje istnienie tego pola jako wskazówkę, że rozmowa to grupa.

Ten styl dotyczy tylko urządzeń z Androidem 7.0 (poziom interfejsu API 24) i nowszym. Gdy używasz biblioteki zgodności (NotificationCompat), jak pokazano wcześniej, powiadomienia z MessagingStyle automatycznie wracają do obsługiwanego stylu rozwiniętego powiadomienia.

Tworząc takie powiadomienie dla rozmowy na czacie, dodaj odpowiedź bezpośrednią.

Utwórz powiadomienie za pomocą opcji sterowania multimediami

Zastosuj MediaStyleNotificationHelper.MediaStyle, aby wyświetlić elementy sterujące odtwarzaniem multimediów i informacje o utworze.

Określ w konstruktorze powiązane MediaSession. Dzięki temu Android będzie wyświetlać odpowiednie informacje o multimediach.

Wywołaj addAction() maksymalnie 5 razy, aby wyświetlić maksymalnie 5 przycisków z ikoną. Wywołaj setLargeIcon(), aby ustawić okładkę albumu.

W przeciwieństwie do innych stylów powiadomień MediaStyle umożliwia też zmianę widoku treści zwiniętej przez podanie 3 przycisków poleceń, które również pojawiają się w widoku zwiniętym. Aby to zrobić, podaj indeksy przycisku polecenia do setShowActionsInCompactView().

Poniższy przykład pokazuje, jak utworzyć powiadomienie za pomocą opcji sterowania multimediami:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        // Show controls on lock screen even when user hides sensitive content.
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setSmallIcon(R.drawable.ic_stat_player)
        // Add media control buttons that invoke intents in your media service
        .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
        .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
        .addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
        // Apply the media style template.
        .setStyle(MediaStyleNotificationHelper.MediaStyle(mediaSession)
                .setShowActionsInCompactView(1 /* #1: pause button \*/))
        .setContentTitle("Wonderful music")
        .setContentText("My Awesome Band")
        .setLargeIcon(albumArtBitmap)
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        // Show controls on lock screen even when user hides sensitive content.
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setSmallIcon(R.drawable.ic_stat_player)
        // Add media control buttons that invoke intents in your media service
        .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
        .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)  // #1
        .addAction(R.drawable.ic_next, "Next", nextPendingIntent)     // #2
        // Apply the media style template.
        .setStyle(new MediaStyleNotificationHelper.MediaStyle(mediaSession)
                .setShowActionsInCompactView(1 /* #1: pause button */))
        .setContentTitle("Wonderful music")
        .setContentText("My Awesome Band")
        .setLargeIcon(albumArtBitmap)
        .build();
Obraz przedstawiający powiadomienie ze stylem multimediów
Rysunek 5. Powiadomienie z użyciem: MediaStyleNotificationHelper.MediaStyle.

Dodatkowe materiały

Więcej informacji o MediaStyle i rozwijanych powiadomieniach znajdziesz w materiałach poniżej.