Notification Channel(通知渠道)—— 是 Android 8.0(API 26)版本引入的一种机制,用于按类别对通知进行分组,并让用户控制其行为。每个渠道定义了通过它发送的所有通知的重要性级别、声音、振动和视觉外观。根据 Android Developers,NotificationChannel 对于 Android 8+ 上的所有通知都是必需的 —— 没有它,通知将不会显示。
要点
Notification Channel —— 是 Android 8+(Oreo)中用于同一类型通知的逻辑容器。开发人员使用唯一 ID 创建渠道,设置其参数,然后在发送每个通知时指定此渠道。同一渠道中的所有通知都继承其设置。
在 Android 8 之前,通知管理是二元的:要么全部,要么全不。用户只能完全关闭应用的所有通知。渠道解决了这个问题:现在可以关闭广告通知,同时保留来自朋友的消息。
创建渠道后,其重要性(importance)可以通过设置 → 应用 → 通知由用户随时更改。开发人员在创建渠道后无法以编程方式更改重要性 —— 这是 Android 的安全限制。
在 Android 8+ 上,每个通知必须通过 NotificationChannel 发送。如果应用尝试在没有渠道的情况下显示通知 —— 系统将静默忽略它。例外情况 —— 通过 NotificationCompat 使用默认渠道的通知,该渠道由库自动创建。
通知渠道由通过 NotificationChannel 类创建时设置的一组参数定义。主要参数 —— 重要性级别(importance level),它决定了通知如何与用户交互。
创建后,渠道将出现在系统通知设置中。用户可以更改重要性、关闭声音、振动或完全阻止渠道。所有更改立即对所有后续通知生效。
创建 NotificationChannel 时,可以配置:声音(自定义或系统)、振动(模式和持续时间)、指示灯(LED 颜色)、徽章(setShowBadge)、锁屏可见性(setLockscreenVisibility)和请勿打扰模式(setBypassDnd)。这些参数在创建渠道时固定,之后只能由用户更改。
重要性级别(importance)—— 渠道的主要参数。它决定通知是否会播放声音、出现在屏幕上或只是放在阴影中。重要性不应与优先级混淆 —— 重要性由渠道设置,而优先级(setPriority)在 Android 8+ 上被忽略。
| 级别 | 常量 | 行为 | 声音 |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | 显示横幅,出现在通知面板中 | 是 |
| DEFAULT | IMPORTANCE_DEFAULT (3) | 出现在通知面板中,无横幅 | 是 |
| LOW | IMPORTANCE_LOW (2) | 无声音出现在通知面板中 | 否 |
| MIN | IMPORTANCE_MIN (1) | 仅在阴影中,无声音和振动 | 否 |
| NONE | IMPORTANCE_NONE (0) | 根本不显示 | 否 |
对于大多数用户场景,使用 IMPORTANCE_DEFAULT (3) —— 通知将出现在面板中并带有声音,但没有弹出横幅。IMPORTANCE_HIGH 仅用于关键事件:来电、来自对话者的消息、带计时器的提醒。
渠道只需创建一次 —— 在应用启动时或首次使用时。最佳实践是在应用启动时在 Application.onCreate 方法中创建所有渠道。重新创建已存在的渠道是安全的 —— 如果渠道已存在,Android 将忽略该调用。
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"消息",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "新消息通知"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"促销与新闻",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "营销通知和特别优惠"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
发送通知时,通过 setChannelId(对于 NotificationCompat)或在 Notification.Builder 的构造函数中指定渠道 ID。如果指定 ID 的渠道不存在 —— 通知不会显示,但不会产生错误。
Android 提供了多个 API 用于以编程方式管理渠道:获取列表、删除和检查当前设置。删除渠道会导致系统从历史记录中删除其所有通知。
val manager =
getSystemService(NotificationManager::class.java)
// 获取所有渠道列表
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("渠道", "${channel.id}: ${channel.importance}")
}
// 了解当前重要性(用户可能已更改)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// 用户已关闭渠道
suggestEnablingChannel()
}
// 删除渠道
manager.deleteNotificationChannel(CHANNEL_PROMO)
创建渠道后,开发人员无法以编程方式更改其重要性 —— 这是 Android 为保护用户免受滥用而设置的限制。如果需要更改渠道的重要性,请使用不同的 ID 创建新渠道并迁移通知。
如果需要更改现有渠道的重要性,请使用不同的 ID(例如 “messages_v2”)创建新渠道,并开始向其发送通知。旧渠道可以通过 deleteNotificationChannel 删除 —— 其所有通知都将从历史记录中删除。通过应用程序界面通知用户有关迁移的信息,以免丢失设置。
NotificationChannelGroup 将多个渠道组合成 Android 设置界面中的一个视觉组。当应用程序使用 5 个以上渠道时,组帮助用户导航:例如 “社交”、“系统”、“营销”。
组通过 createNotificationChannelGroup 创建,并在创建时通过 setGroup 方法传递给渠道。删除组也会删除其所有渠道。每个渠道只能属于一个组。
在实践中,渠道组建议用于拥有超过 3 个渠道的应用程序。它们简化了设置中的导航,并降低了用户在不理解渠道列表的情况下一次性关闭所有通知的可能性。
组通过 createNotificationChannelGroup 使用唯一 ID 和名称创建。然后每个渠道通过 setGroup 方法连接到组。在系统设置中,组显示为带有标题的部分,该组的所有渠道都在其下方。如果组被删除,其所有渠道也会被系统自动删除,无法恢复。
正确设计通知渠道直接影响用户体验和留存率。基本模式 —— 三个重要性级别:关键渠道(IMPORTANCE_HIGH)用于消息和通话,标准(IMPORTANCE_DEFAULT)用于一般通知,安静(IMPORTANCE_LOW)用于营销和新闻。这种分级给用户提供了清晰的选择,而不会造成负担。
第二种模式 —— 按功能模块划分渠道。应用程序的每个主要模块(聊天、订单、信息流、营销)都有自己的渠道。如果模块超过 5 个,将它们组合到 NotificationChannelGroup 中。在系统设置中,组显示为带有可隐藏元素的部分 —— 这简化了导航。
第三种模式 —— 开发人员渠道。使用 IMPORTANCE_MIN 为调试和服务通知创建单独的渠道。用户不会在面板中看到它们,但开发人员可以通过 adb 分析日志。在生产环境中,此渠道可以通过设置中的 Intent 删除或从界面中隐藏。
第四种模式 —— 关于渠道的反馈。在界面中向用户显示哪些渠道是活跃的以及它们当前的重要性。在 Android 8+ 上,可以通过 getNotificationChannel 获取渠道状态,并在渠道关闭时向用户建议更改设置。这对于应用程序的关键功能尤其重要。
常见问题
通知不会显示在面板或阴影中。系统将静默忽略 notify() 调用。例外情况:使用 NotificationCompat 时,库会创建默认渠道,但其重要性始终为 DEFAULT。建议始终创建自己的渠道。
可以更改渠道的名称、描述和声音。重要性无法更改 —— 此决定受系统保护,防止开发人员修改。如果需要提高重要性 —— 使用不同的 ID 创建新渠道,并将其用于新的通知。用户可以随时更改重要性。
使用 getNotificationChannel 并检查重要性:如果值为 IMPORTANCE_NONE,则渠道已关闭。您还可以通过 Intent 打开渠道的系统设置:Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS,参数为 app_package 和 channel_id。
没有限制 —— Android 对渠道数量没有设定限制。但建议创建不超过 5–10 个渠道,以免使用户在选择时负担过重。最佳最小值是 2–3 个渠道:关键通知、普通通知和营销通知。
在 Android 7.1(API 25)及更早版本上,渠道不受支持。NotificationChannel 类仅从 API 26 开始可用。为了向后兼容,请使用 NotificationCompat 并将渠道创建包装在 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 条件中。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。