创建和管理通知渠道

从 Android 8.0(API 级别 26)开始,所有通知都必须分配给 。对于每个声道,您可以设置 会应用于该频道中的所有通知用户可以更改这些设置 并确定应用中的哪些通知渠道可能具有干扰性或 可见。

请观看以下视频,简要了解渠道和其他通知 Android 8.0 中的新功能。

通知渠道的用户设置适用于 如图 1 所示。

图 1. 时钟应用的通知设置 以及它的某个频道

创建通知渠道后,您便无法更改通知 行为此时用户就拥有完全控制权。不过,您仍然可以 更改频道的名称和说明。

为需要发送的每种通知类型创建一个渠道。您还可以 创建通知渠道来反映用户做出的选择。例如,您 可以为由 Google 创建的每个会话组设置单独的通知渠道, 在即时通讯应用中访问用户

以 Android 8.0(API 级别 26)或更高版本为目标平台时,您必须实现其中一个或 更多通知渠道。如果您的 targetSdkVersion 设为 25 或更低, 当您的应用在 Android 8.0(API 级别 26)或更高版本上运行时,其行为相同 与搭载 Android 7.1(API 级别 25)或更低版本的设备上一样。

创建通知渠道

如需创建通知渠道,请按以下步骤操作:

  1. 构建一个 NotificationChannel 对象 具有唯一的渠道 ID、用户可见的名称和重要性级别。

  2. (可选)指定用户在系统设置中看到的说明 替换为 setDescription()

  3. 注册通知渠道,方法是将该渠道传递给 createNotificationChannel()

以下示例展示了如何创建和注册通知渠道:

Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    val name = getString(R.string.channel_name)
    val descriptionText = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system. You can't change the importance
    // or other notification behaviors after this.
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}

Java

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system. You can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

使用原始值重新创建现有的通知渠道不会 操作,因此在启动应用时可以放心调用此代码。

默认情况下,发布到指定频道的所有通知都使用视觉元素和 根据重要性级别定义的听觉行为, NotificationManagerCompat 类别,例如 IMPORTANCE_DEFAULTIMPORTANCE_HIGH。 请参阅下一部分,详细了解 重要性级别

如果您想进一步自定义频道的默认通知行为, 您可以调用 enableLights()setLightColor(), 和 setVibrationPattern()NotificationChannel 上。请注意,创建频道后 无法更改这些设置,且对于是否使用相应设置,用户拥有最终控制权 行为活跃。

您还可以在一次操作中创建多个通知渠道,方法是 呼叫 createNotificationChannels()

设置重要性级别

渠道重要性会影响以下位置发布的所有通知的干扰级别: 频道使用以下任一方法在 NotificationChannel 构造函数中指定该对象。 五个重要性级别 IMPORTANCE_NONE(0) 更改为 IMPORTANCE_HIGH(4)

如需支持搭载 Android 7.1(API 级别 25)或更低版本的设备,您还必须: 致电 setPriority() 并使用 NotificationCompat 类。

重要性 (NotificationManager.IMPORTANCE_*) 和优先级 (NotificationCompat.PRIORITY_*) 常量映射到用户可见的重要性 选项,如下表所示。

用户可见的重要性级别 重要性(Android 8.0 及更高版本) 优先级(Android 7.1 及更低版本)
紧急
:发出提示音,并以浮动通知的形式显示。
IMPORTANCE_HIGH PRIORITY_HIGHPRIORITY_MAX

:发出提示音。
IMPORTANCE_DEFAULT PRIORITY_DEFAULT

不发出声音。
IMPORTANCE_LOW PRIORITY_LOW

不发出提示音,且不会显示在状态栏中。
IMPORTANCE_MIN PRIORITY_MIN

不发出提示音,且不会显示在状态栏或通知栏中。
IMPORTANCE_NONE N/A

无论重要程度如何,所有通知都会显示在非干扰系统中 界面位置,例如在抽屉式通知栏中和 启动器图标上的一个标记, 当然可以 修改通知标志的外观

您将频道提交到 NotificationManager,您 无法更改重要性级别。不过,用户可以 应用渠道的偏好设置。

有关选择合适优先级的信息,请参见 级别"在 通知设计指南

读取通知渠道设置

用户可以修改通知渠道的设置,包括行为 例如振动和警报声如果您想了解用户的设置 适用于您的通知渠道,请按以下步骤操作:

  1. 通过调用以下方法来获取 NotificationChannel 对象: getNotificationChannel()getNotificationChannels()

  2. 查询特定的渠道设置,例如 getVibrationPattern()getSound()getImportance()

如果您认为自己的频道设置阻碍了预期行为 您可以建议用户进行更改并提供操作 打开频道设置,如下一部分所示。

打开通知渠道设置

创建通知渠道后,您便无法更改通知 程序化地显示频道的视觉和听觉行为。只有用户可以 通过系统设置更改频道行为。为了向您的用户提供 轻松访问这些通知设置,请在您应用程序的 设置界面

您可以使用 Intent,使用 ACTION_CHANNEL_NOTIFICATION_SETTINGS 操作。

例如,以下示例代码展示了如何将用户重定向到 通知渠道的设置:

Kotlin

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)

Java

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
startActivity(intent);

请注意,该 intent 需要两个 extra 来指定应用的软件包名称 (也称为应用 ID)以及要修改的渠道。

删除通知渠道

您可以通过调用 deleteNotificationChannel()。 以下示例代码演示了如何完成此过程:

Kotlin

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)

Java

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
notificationManager.deleteNotificationChannel(id);

创建通知渠道分组

如果您想进一步整理频道在设置界面中的外观, 您可以创建渠道组如果您的应用支持 多个用户账号,例如 工作资料,因为它可以让您创建 通知渠道组。这样,用户就可以轻松 以及控制名称相同的多个通知渠道。

图 2. 通知渠道设置 群组。

例如,社交网络应用可能包含对个人和工作的支持 账号。在这种情况下,每个账号可能需要收到多条通知 具有相同功能和名称的渠道,例如:

  • 具有两个渠道的个人账号:

    • 新评论

    • 帖子推荐

  • 具有两个渠道的企业账号:

    • 新评论

    • 帖子推荐

通过针对每个账号将通知渠道分组,用户可以 区分它们。

每个通知渠道组都需要一个 ID,该 ID 在您的 以及用户可见名称以下代码段展示了如何 创建通知渠道组

Kotlin

// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

Java

// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

创建新群组后,您可以 setGroup() 将新的 NotificationChannel 对象与该群组相关联。

将渠道提交给通知管理器后,您便无法更改 通知渠道和组之间的关联。