如何正确初始化和使用NotificationChannelGroup

时间:2018-03-05 07:01:12

标签: android-8.0-oreo notification-channel

通知渠道和群体似乎很简单。

直观地说,我希望为每个通知类别创建一个频道,然后为每个用户创建组。最后,所有通知都应根据其唯一的通道组配对进行捆绑。

然而,情况似乎并非如此;通知只能按组分隔,并且通道似乎没有效果。

目前我在应用程序生命周期中创建了所有内容:

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个组。 对于任何通知,我将为其分配一个唯一的标记ID对,然后指定一个频道和一个与我要提交的频道相对应的组。然后,我添加摘要通知以匹配相同的组 - 通道对。但是,我最终只有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.

该文档使得通道可以成为多个(或每个)组的一部分,几乎每个实现它的文章都会使它看起来如此。

我们如何将频道与频道组相关联? 我们是否应该为每个群体建立一个新频道或重新使用它们? 如果我们应该重用它们,我们如何或何时设置通道组?

0 个答案:

没有答案