Notifications. Групування сповіщень

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

Виглядає це так:

Ви можете розгорнути/згорнути/видалити групу. На окреме повідомлення ви також можете натиснути або видалити його. Якщо сповіщень у групі стає менше 4, то сповіщення стають окремими від групи.

Усі ваші сповіщення потраплятимуть в одну безіменну групу. За замовчуванням, натискання на цю групу відкриє застосунок.

Розглянемо, які можливості управління групами нам надано.

Ми можемо:

  1. створювати кілька груп і самі вирішувати, в яку з них піде нове повідомлення. Група відображатиметься, коли в ній є хоча б два повідомлення.
  2. додати до групи текстовий опис
  3. додати до групи 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 у білдері кожного сповіщення. Передаєте в нього строкове значення, і за ним буде виконуватися сортування.