Как правильно инициализировать и использовать NotificationChannelGroup

Каналы и группы уведомлений кажутся простыми.

Интуитивно я ожидал создать канал для каждой категории уведомлений, а затем создать группы для каждого пользователя. В конце все уведомления должны быть объединены на основе их уникального сопряжения группы каналов.

Тем не менее, это не так; уведомления разделены только группами, и каналы, похоже, не действуют.

В настоящее время я создаю все в течение жизненного цикла приложения:

const val NOTIF_CHANNEL_GENERAL = "general"
const val NOTIF_CHANNEL_MESSAGES = "messages"

fun setupNotificationChannels(c: Context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return
    val manager = c.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val appName = c.string(R.string.frost_name)
    val msg = c.string(R.string.messages)
    manager.createNotificationChannel(NOTIF_CHANNEL_GENERAL, appName)
    manager.createNotificationChannel(NOTIF_CHANNEL_MESSAGES, "$appName: $msg")
    manager.deleteNotificationChannel(BuildConfig.APPLICATION_ID)
    val cookies = loadFbCookiesSync()
    val idMap = cookies.map { it.id.toString() to it.name }.toMap()
    manager.notificationChannelGroups
            .filter { !idMap.contains(it.id) }
            .forEach { manager.deleteNotificationChannelGroup(it.id) }
    val groups = idMap.map { (id, name) ->
        NotificationChannelGroup(id, name)
    }
    manager.createNotificationChannelGroups(groups)
    L.d { "Created notification channels: ${manager.notificationChannels.size} channels, ${manager.notificationChannelGroups.size} groups" }
}

@RequiresApi(Build.VERSION_CODES.O)
private fun NotificationManager.createNotificationChannel(id: String, name: String): NotificationChannel {
    val channel = NotificationChannel("${BuildConfig.APPLICATION_ID}_$id",
            name, NotificationManager.IMPORTANCE_DEFAULT)
    channel.enableLights(true)
    channel.lightColor = Prefs.accentColor
    channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
    createNotificationChannel(channel)
    return channel
}

Из моих журналов видно, что создано 2 канала и 2 группы. Для любого уведомления я назначу ему уникальную пару идентификаторов тегов, затем укажу канал и группу, соответствующие той, которую я хочу отправить. Затем я добавляю сводное уведомление для соответствия той же паре групповой канал. Тем не менее, я получаю только 2 группы уведомлений, где у каждой группы есть уведомления от обоих каналов.

Одна проблема, которую я заметил, состоит в том, что список каналов групп пуст, что весьма вероятно. Тем не менее, единственный способ увидеть привязку, позвонив setGroup в канале. Каждый канал может быть только частью одной группы, но в описании групп каналов упоминается:

 *     For example, if your application supports multiple accounts, and those accounts will
 *     have similar channels, you can create a group for each account with account specific
 *     labels instead of appending account information to each channel's label.

Документация создает впечатление, что каналы могут быть частью нескольких (или каждой) группы, и почти каждая статья, реализующая ее, также выглядит так.

Как мы должны связать каналы с группами каналов? Мы должны создать новый канал для каждой группы или использовать их повторно? Если мы должны использовать их повторно, как или когда мы устанавливаем группы каналов?

1 ответ

Каждый NotificationChannel может быть назначен только одной группе с помощьюchannel.setGroup(groupID). В вашем коде я не вижу, где вы выполняете это задание.

Группы - это всего лишь способ организации каналов в пользовательском интерфейсе, но они не содержат никакой логики (т.е. вы не можете отправить уведомление на идентификатор группы, только на идентификатор канала). Также вам необходимо создать группу NotificationChannelGroup, прежде чем назначать ей канал.

Если вы хотите переместить канал в другую группу, вNotificationManagerназываетсяupdateNotificationChannelгде вы можете изменить группу вашего канала и обновить его.

В документации есть дополнительная информация https://developer.android.com/develop/ui/views/notifications/channels#CreateChannelGroup .

Другие вопросы по тегам