Notifications. Групування сповіщень
В Android 7 (API 24) з'явилася можливість групувати сповіщення. Навіть якщо ви це явно не реалізуєте, система сама створить групу, якщо у вас 4 і більше повідомлень.
Виглядає це так:

Ви можете розгорнути/згорнути/видалити групу. На окреме повідомлення ви також можете натиснути або видалити його. Якщо сповіщень у групі стає менше 4, то сповіщення стають окремими від групи.
Усі ваші сповіщення потраплятимуть в одну безіменну групу. За замовчуванням, натискання на цю групу відкриє застосунок.
Розглянемо, які можливості управління групами нам надано.
Ми можемо:
- створювати кілька груп і самі вирішувати, в яку з них піде нове повідомлення. Група відображатиметься, коли в ній є хоча б два повідомлення.
- додати до групи текстовий опис
- додати до групи
PendingIntent, який спрацює після натискання на групу
Як приклад можна розглянути поштовий додаток. У користувача є кілька акаунтів і в них приходять нові листи. Буде розумно створювати окрему групу для кожного акаунта. Кожна така група відображатиме тільки ті листи, які знаходяться в певному акаунті.
Розглянемо на практиці. Створюємо повідомлення:
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Sender " + 1)
.setContentText("Subject text " + 1)
.setGroup(GROUP_KEY);
Notification notification = mBuilder.build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);
Повідомлення створюється так само, як зазвичай. Додано тільки метод setGroup. У ньому нам потрібно вказати String ключ групи, щоб система знала, в яку групу поміщати це повідомлення.
Створюємо групу:
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentInfo("user_mail.com")
.setGroup(GROUP_KEY)
.setGroupSummary(true);
Notification notification = mBuilder.build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(-100, notification);
Група створюється так само, як і повідомлення. Але тексти, які ми зазвичай передаємо в setContentTitle і setContentTitle, у групі не відображаються, тому я в прикладі їх не використовую. Щоправда, у наступних версіях Android відображення груп може змінитися, і вони раптом почнуть відображати title і text. Може і має сенс передавати туди що-небудь.
А ось текст із методу setContentInfo буде відображено, і це дає нам змогу дати якийсь текстовий опис для групи, щоб користувач розумів, про що вона. Оскільки ми розглядаємо приклад поштового застосунку, то можна використовувати ім'я акаунта користувача. Користувач буде бачити, в якій групі, вміст якого акаунта відображається.
У setGroup передаємо String ключ групи. Його ж ми використовуємо при створенні повідомлень, які повинні потрапляти в цю групу.
У setGroupSummary вказуємо true. Це означає, що повідомлення є групою.
У методі notify, так само, як і для звичайного повідомлення, необхідно вказувати id. Тут будьте уважні і стежте, щоб у повідомлення і у групи не збіглися id. Група все-таки є звичайним повідомленням. А в разі збігу id, одне повідомлення замінить інше.
Як варіант, для повідомлень про новий лист можна брати id листа, а для груп - від'ємне значення id акаунта. Тоді вони точно не перетнуться.
У підсумку ви отримаєте таку картину

Три нові листи зібралися в одну групу. І в описі групи видно, що вона відображає листи акаунта user@mail.com.
Коли створювати групу
Групу має сенс відображати щоразу після створення повідомлення, яке входить до цієї групи. Якщо група вже існує і відображається, то просто нічого не станеться (якщо ви не змінювали параметри групи).
А якщо ми відобразимо групу тільки один раз, і користувач у якийсь момент видалить її з повідомлень, то всі наші нові повідомлення залишаться без групи.
Сортування в групі
Ви можете сортувати сповіщення в групі, використовуючи метод setSortKey у білдері кожного сповіщення. Передаєте в нього строкове значення, і за ним буде виконуватися сортування.