从 Android 8.0(API 级别 26)开始,所有通知都必须分配给 。对于每个声道,您可以设置 会应用于该频道中的所有通知用户可以更改这些设置 并确定应用中的哪些通知渠道可能具有干扰性或 可见。
请观看以下视频,简要了解渠道和其他通知 Android 8.0 中的新功能。
通知渠道的用户设置适用于 如图 1 所示。
创建通知渠道后,您便无法更改通知 行为此时用户就拥有完全控制权。不过,您仍然可以 更改频道的名称和说明。
为需要发送的每种通知类型创建一个渠道。您还可以 创建通知渠道来反映用户做出的选择。例如,您 可以为由 Google 创建的每个会话组设置单独的通知渠道, 在即时通讯应用中访问用户
以 Android 8.0(API 级别 26)或更高版本为目标平台时,您必须实现其中一个或
更多通知渠道。如果您的 targetSdkVersion
设为 25 或更低,
当您的应用在 Android 8.0(API 级别 26)或更高版本上运行时,其行为相同
与搭载 Android 7.1(API 级别 25)或更低版本的设备上一样。
创建通知渠道
如需创建通知渠道,请按以下步骤操作:
构建一个
NotificationChannel
对象 具有唯一的渠道 ID、用户可见的名称和重要性级别。(可选)指定用户在系统设置中看到的说明 替换为
setDescription()
。注册通知渠道,方法是将该渠道传递给
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_DEFAULT
或
IMPORTANCE_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_HIGH 或 PRIORITY_MAX |
高 :发出提示音。 |
IMPORTANCE_DEFAULT |
PRIORITY_DEFAULT |
中 不发出声音。 |
IMPORTANCE_LOW |
PRIORITY_LOW |
低 不发出提示音,且不会显示在状态栏中。 |
IMPORTANCE_MIN |
PRIORITY_MIN |
无 不发出提示音,且不会显示在状态栏或通知栏中。 |
IMPORTANCE_NONE |
N/A |
无论重要程度如何,所有通知都会显示在非干扰系统中 界面位置,例如在抽屉式通知栏中和 启动器图标上的一个标记, 当然可以 修改通知标志的外观。
您将频道提交到
NotificationManager
,您
无法更改重要性级别。不过,用户可以
应用渠道的偏好设置。
有关选择合适优先级的信息,请参见 级别"在 通知设计指南。
读取通知渠道设置
用户可以修改通知渠道的设置,包括行为 例如振动和警报声如果您想了解用户的设置 适用于您的通知渠道,请按以下步骤操作:
通过调用以下方法来获取
NotificationChannel
对象:getNotificationChannel()
或getNotificationChannels()
。查询特定的渠道设置,例如
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);
创建通知渠道分组
如果您想进一步整理频道在设置界面中的外观, 您可以创建渠道组如果您的应用支持 多个用户账号,例如 工作资料,因为它可以让您创建 通知渠道组。这样,用户就可以轻松 以及控制名称相同的多个通知渠道。
例如,社交网络应用可能包含对个人和工作的支持 账号。在这种情况下,每个账号可能需要收到多条通知 具有相同功能和名称的渠道,例如:
具有两个渠道的个人账号:
新评论
帖子推荐
具有两个渠道的企业账号:
新评论
帖子推荐
通过针对每个账号将通知渠道分组,用户可以 区分它们。
每个通知渠道组都需要一个 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
对象与该群组相关联。
将渠道提交给通知管理器后,您便无法更改 通知渠道和组之间的关联。