前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建管理通知渠道

创建管理通知渠道

作者头像
佛系编码
发布2018-05-22 11:51:21
7940
发布2018-05-22 11:51:21
举报
文章被收录于专栏:Android学习之路Android学习之路

创建 和管理 通知渠道

从Android8.0(API26)开始,所有的通知必须分配一个渠道。每一个渠道,你都可以设置渠道中所有通知的视觉和听觉行为。然后,用户能够随意修改这些设置来决定通知的行为。

视频说明 https://youtu.be/zGIw4MIJn5o

用户能够设置每个App的通知渠道行为

更改渠道行为
更改渠道行为

在用户界面渠道显示为 “类别”

渠道创建后就不能更改通知行为了,用户能够完全控制通知的行为,但我们还是可以更改说明和渠道名称

我们可以为每个不同类型的通知创建一个渠道;

如果 target>=26 就必须使用渠道。如果target是在26以下,但是运行在了26及以上了,不要怕,还是会和往常一样,不会抛出异常。

如果 target>=26; 在26及以上运行的时候没有指定一个渠道,通知是不会发出的,系统会记录此错误。可以在logcat看到

Android O 有一个新的开发者设置,当发送了没有指定渠道的通知时显示一个toast。 Settings > Developer options and enable Show notification channel warnings

创建 通知渠道

创建渠道有三个步骤

  1. 使用一个唯一ID,一个用户可见的渠道名称和一个渠道重要性 三个参数构造一个NotificationChannel实例
  2. (可选)设置渠道描述 通过 setDescription();
  3. 通过NotificationManagercreateNotificationChannel()创建渠道

Note: 确保创建代码运行在Android O及以上,因为渠道的API没有在support library中

代码语言:javascript
复制

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

如果创建的渠道已经存在当程序运行的时候不会出现异常

通知的行为默认是通过设置的重要性(构建Channel实例的第三个参数)来决定的。这些参数来自于NotificationManagerCompat中的几个常量。

如果想更进一步的自定行为可以参考以下方法 ;行为在渠道创建后是不能修改的,用户能够完全控制这些设置。

  • 指示灯是否开启 enableLights()
  • 指示灯的颜色 setLightColor()
  • 设置震动模式 setVibrationPattern()

可以通过 createNotificationChannel() 创建多个渠道;

除了给通知添加渠道,还可以考虑为通知添加系统类型。参考:https://developer.android.google.cn/training/notify-user/build-notification.html#system-category

设置重要性级别

渠道重要性决定了渠道中所有的通知打断级别,必须在渠道构造方法中设置重要性级别。有五个重要性级别 从IMPORTANCE_NONE(0) 到 IMPORTANCE_HIGH(4),我们可以将他们指定给渠道中的所有通知。

为了兼容Android O 以下的版本 必须为通知设置优先级setPriority() 。参数是 NotificationCompat中的几个常量

重要性级别和优先级常量映射到的用户可见的重要性选项如下

用户可见的重要性级别

重要性级别(Android O及以上)

优先级(Android O 以下)

紧急。发出声音并显示为单条通知

IMPORTANCE_HIGH

PRIORITY_HIGH or PRIORITY_MAX

高。发出声音

IMPORTANCE_DEFAULT

PRIORITY_DEFAULT

中。没有声音

IMPORTANCE_LOW

PRIORITY_LOW

低。没有声音也不会出现在状态栏中

IMPORTANCE_MIN

PRIORITY_MIN

所有的通知,不管重要性如何,都会出现在不影响用户的系统界面上。例如通知栏,启动图标的通知点(可以改变样式或是否显示)

一但将渠道提交到NotificationManager 就不能再修改重要性级别了,但是用户可随意随时修改。

有关选择适当优先级的信息 ,查看 通知设计指南中的 正确设置和管理优先级

读取通知渠道设置

用户可以在设置界面设置渠道的行为(震动,声音等)可以通过以下步骤获取到用户对我们渠道的行为设置。

  1. 通过 getNotificationChannel() or getNotificationChannels() 获取NotificationChannel 实例
  2. 查询指定的设置 例如 getSound(),getImportance(),getVibrationPattern()

如果检测到用户设置会影响程序的行为。我们可以给用户一个操作让其改变设置。

打开通知渠道设置

渠道在创建了之后就不能通过代码的方式改变其行为了,只能用户在系统设置修改。为了方便用户修改我们可以通过代码打开系统设置,让用户更方便的修改。

通过Intent使用action:ACTION_CHANNEL_NOTIFICATION_SETTINGS 打开系统设置。 需要两个参数 一个是包名 一个是渠道id。

下面就是打开系统设置渠道的代码。

代码语言:javascript
复制
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);

删除通知渠道

可以通过以下代码删除渠道

代码语言:javascript
复制
NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
mNotificationManager.deleteNotificationChannel(id);

系统设置会显示已经删除的渠道数量,作为垃圾邮件防范机制。可以通过重装程序或者清楚数据来清除测试渠道

创建渠道分组

如果想要更好的在系统设置UI中显示渠道外观,可以创建渠道分组。当你的APP支持多用户的时候可以为每个账户创建一个渠道分组。这样,用户可以轻易的识别和控制具有相同名字的渠道。

个人和工作账户的通知渠道分组
个人和工作账户的通知渠道分组

例如,一个网络社交APP可能包含支持个人和工作账户,这种情况下,每个账户可能需要多个相同功能和名称的多个渠道,如下所示:

  • 个人账户的两个渠道
    • 新评论
    • 发布推荐
  • 工作账号的两个渠道
    • 新评论
    • 发布推荐 将每个账户的渠道分组确保用户能够轻易的区分它们。

每一个渠道分组都需要一个包内唯一的ID和一个用户可见的名称,下面代码演示怎么创建一个分组

代码语言:javascript
复制
// 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 mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(group_id, group_name));

创建分组后可以通过渠道的setGroup()来关联分组; 将渠道提交到通知管理后就无法改变关联关系了。

end

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建 和管理 通知渠道
    • 创建 通知渠道
      • 设置重要性级别
        • 读取通知渠道设置
          • 打开通知渠道设置
            • 删除通知渠道
              • 创建渠道分组
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档