Группировка оповещений в Android 7

  • Tutorial
После обновления на Android 7 мы заметили, что уведомления стали группироваться по приложению автоматически. Так как на момент выхода новой версии Android в нашем приложении еще не было истории уведомлений это изменение было достаточно критично — в одной группе отображается только 7 уведомлений. Это значит, что если приходит более 20 уведомлений в сутки через приложение — необходимо смахивать новые чтобы увидеть более старые.

Уведомления в группе сортируются по приоритету. Если у вас в группе 7 уведомлений и приходит еще одно низкого приоритета — оно сначала будет наверху, а потом улетит в самый низ и его совсем не будет видно списке, до тех пор пока вы не удалите некоторое число уведомлений.

Мы сделали группировку по каналам, это позволяет сразу видеть канал и при возможности свернуть его. Даже если канал пришлет вам 100 уведомлений — они все равно легко сворачиваются и удаляются одним движением.

В этой статье мы расскажем, почему официальный мануал не работает, и как мы нашли способ сделать все правильно.

Что говорит официальный мануал?




Если зайти сюда, то тут нам рекомендуют просто «You can use the Builder.setGroup() method to bundle similar notifications». И далее рекомендуют перейти сюда.


Это работает только на Android Wear. Мы нашли решение методом тыка, однако при написании статьи был найден еще один мануал в статье. Он частично верен, но описано очень мало.

Как сделали мы


В мануале выше написано: «It is important to also create a summary notification. This summary notification, denoted by setGroupSummary(true), is the only notification that appears on Marshmallow and lower devices and should (you guessed it) summarize all of the individual notifications. This is an opportune time to use the InboxStyle, although using it is not a requirement. On Android N and higher devices, some information (such as the subtext, content intent, and delete intent) is extracted from the summary notification to produce the collapsed notification for the bundled notifications so you should continue to generate a summary notification on all API levels.»

Тут сразу всплывают те болячки на которые мы напоролись.

1. Нужно ограничить версию API


До Android 7 версии лучше вообще выключить группировку — так как иначе у вас не будут показаны уведомления в группе при использовании нашего решения.

Boolean groupflag = false;
if(Build.VERSION.SDK_INT > 23){
            groupflag = true;
        }

2. Автозакрытие и пересоздание


Если не будет указано setAutoCancel(true) — при клике на последние уведомление из группы — группа останется висеть в списке. При приходе еще одного уведомления из группы можно пересоздать основное заголовочное с тем же ID — для идентификации мы используем для такого уведомления ID канала (subid), а через setContentTitle задается заголовок группы.

if(groupflag) {
            Notification mainnotif = new NotificationCompat.Builder(this)
                    .setContentTitle(subname)
                    .setAutoCancel(true)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setGroupSummary(true)
                    .setGroup(subname)
                    .setStyle(new NotificationCompat.MessagingStyle(subname))
                    .setColor(ContextCompat.getColor(context, R.color.blue))
                    .setSubText(subname)
                    .build();
            notificationManager.notify(subid, mainnotif);
        }

3. Создание самого уведомления


Не забываем setGroup(subname). Также интересный лайфхак, если вам нужно просто выключить стандартную группировку — вы можете добавить к примеру, setGroup(«App») без создания заголовочного уведомления. Тогда группировка на самом устройстве работать не будет, но для отключения групп еще и на часах, думаю стоит писать туда тогда рандомный текст. Без указания группы, уведомления будут группироваться по вашему приложению.

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.mipmap.ic_launcher)
                .setAutoCancel(true)
                .setWhen(time)
                .setTicker(title)
                .setLargeIcon(icon)
                .setContentTitle(title)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg)
                .setVibrate(new long[0])
                .setSubText(subname)
                .setGroupSummary(false)
                .setColor(ContextCompat.getColor(context, R.color.blue));


        if(groupflag)
            mBuilder.setGroup(subname);

Попробовать такие уведомления можно в нашем приложении, просто добавьте устройство в аккаунт и пропингуйте через личный кабинет в профиле 4-6 раз. Данная реализация позволяет неплохо экономить место в области уведомлений и эффективно управлять ими. Я очень часто вижу как в приложениях либо заменяют предыдущее уведомления, по сути убирая возможность его прочесть, либо просто не используют группировку там где она возможна.

Также небольшая деталь, если верить разделу про метаданные «метод addPerson() позволяет добавить к уведомлению список людей. С его помощью ваше уведомление может сигнализировать системе о том, что она должна сгруппировать уведомления от указанных людей или считать уведомления от этих людей более важными.» В данном случае можно не использовать вышенаписанное в статье, если у вас используются например уведомления о личных сообщениях пользователей. Однако мы этот способ не пробовали.
PushAll
Платформа подписки на Push-уведомления
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 1

    0
    При приходе еще одного уведомления из группы можно пересоздать основное заголовочное с тем же ID


    Знаете ли вы, что нужно кешировать NotificationCompat.Builder, чтобы при обновлении нотификации на некоторых телефонах оно не мигало?

    Пример обсуждения проблемы.

    Only users with full accounts can post comments. Log in, please.