Notifications. Розширені сповіщення
В Android 4.1 (API 16) з'явилися розширені повідомлення. Якщо потягнути вниз таке сповіщення, то воно відобразить додаткову інформацію.
Щоб створити розширене повідомлення, необхідно додати стиль до білдера. Стилів існує кілька. Усі вони спадкоємці абстрактного класу NotificationCompat.Style. Із назви стилю зазвичай зрозуміло, для чого він може бути використаний.
Розглянемо, наприклад, стиль BigTextStyle, щоб відобразити довгий текст.
Далі я наводитиму тільки код білдера. А як з білдера отримати і відобразити повідомлення, ви можете подивитися в попередніх уроках.
String longText = "To have a notification appear in an expanded view, " +
"first create a NotificationCompat.Builder object " +
"with the normal view options you want. " +
"Next, call Builder.setStyle() with an " +
"expanded layout object as its argument.";
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText("Notification text")
.setStyle(new NotificationCompat.BigTextStyle().bigText(longText));
У білдері повідомлення викликаємо метод setStyle, у який нам необхідно передати стиль. Створюємо стиль BigTextStyle і передаємо йому довгий текст у метод bigText.
Тепер під час розкриття повідомлення відображатиметься довгий текст.

Стиль BigPictureStyle допоможе відобразити велику картинку:
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.startandroid, options);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText("Notification text")
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap));
Створюємо bitmap і передаємо його в BigPictureStyle.
Під час розкриття повідомлення відобразить картинку

Стиль InboxStyle - розмістить до 5 ваших рядків у вигляді списку
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText("Notification text")
.setStyle(new NotificationCompat.InboxStyle()
.addLine("Line 1")
.addLine("Line 2")
.addLine("Line 3"));
Методом addLine додаємо рядки
Результат:

Стиль MessagingStyle зручний для відображення останніх повідомлень із чату:
NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle("You");
messagingStyle.setConversationTitle("Android chat")
.addMessage("Всем привет!", System.currentTimeMillis(), "Ivan")
.addMessage("Кто перешел на новую студию, как оно?", System.currentTimeMillis(), "Ivan")
.addMessage("Я пока не переходил, жду отзывов", System.currentTimeMillis(), "Andrey")
.addMessage("Я перешел", System.currentTimeMillis(), null)
.addMessage("Было несколько проблем, но все решаемо", System.currentTimeMillis(), null)
.addMessage("Ок, спасибо!", System.currentTimeMillis(), "Ivan");
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText("Notification text")
.setStyle(messagingStyle);
У конструкторі MessagingStyle вам необхідно вказати, під яким ім'ям користувач бачитиме свої повідомлення. Зазвичай у чатах використовують слово You (або Me).
У setConversationTitle вказується назва чату. Зазвичай це використовується, коли в чаті більше двох співрозмовників.
Далі, методом addMessage додаються повідомлення. Повідомлення складається з трьох полів: текст, час, відправник. Якщо відправник - null, то це вважається повідомленням користувача, і буде використано ім'я, яке ми вказували в конструкторі MessagingStyle, тобто You.
Додавати можна скільки завгодно повідомлень, але після того, як кількість повідомлень буде більшою, ніж MessagingStyle.MAXIMUM_RETAINED_MESSAGES, старі повідомлення почнуть видалятися. Це зручно і дає змогу не заморочуватися перевірками на кількість.
Відображатимуться повідомлення в тому ж порядку, що ви їх додали.
Виглядати це буде так:

Час повідомлень не відображається. Наскільки я зрозумів, поверхнево подивившись вихідні коди, він поки що взагалі ніде не використовується. Можливо, у майбутніх релізах це зміниться.
Метод addMessage також працює з об'єктом Message. Цей об'єкт містить поля: текст, час і автор. Але крім них є метод setData для зазначення MIME-даних, наприклад картинок.
У деяких стилів є пара загальних методів, які можуть бути корисними: setBigContentTitle і setSummaryText.
Розглянемо їх на прикладі з InboxStyle:
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText("Notification text")
.setStyle(new NotificationCompat.InboxStyle()
.addLine("Line 1")
.addLine("Line 2")
.addLine("Line 3")
.setBigContentTitle("Extended title")
.setSummaryText("+5 more"));
Код майже той самий, що ми розглядали раніше. Додано два методи:
setBigContentTitle- дає змогу вказати заголовок повідомлення, який буде показано під час розкриття повідомленняsetSummaryText- текст буде відображено внизу розширеного повідомлення
Результат:

Під час розкриття повідомлення змінюється заголовок і в нижній частині відображено summary текст.