Oreo Notifications: Channels


title: Android Oreo的通知特性
date: 2018-041-13 03:38:32
tags: Notification


Android 奥利奥已经推出一年了,去年开发者大会的奥利奥新特性册子上也写到了通知的更改,虽然以往的版本很少有关于通知的改动,但是这次的变化还是很大的,官方文档中也比较突出的描述了。在API26及以上的版本需要适配,不然就收不到通知。我们小组上次的版本就没有注意,被反馈回来才知道没有适配。

   fun createNotification() {
        val builder = NotificationCompat.Builder(this)

        val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
        //设置大图标
        builder.setLargeIcon(bitmap)
        //设置小图标
        builder.setSmallIcon(R.drawable.depu)
        //设置标题
        builder.setContentTitle("这是标题,id=$id")
        //设置正文
        builder.setContentText("这是正文")
        //设置摘要
        builder.setSubText("这是摘要")
        //显示指定文本
        builder.setContentInfo("这是info")
        //设置是否点击消息后自动clean
        builder.setAutoCancel(true)
        //可以设置对消息的计数,位置和setContentInfo一样,设置setContentInfo过则setNumber失效
        builder.setNumber(msgNumbe)
        //状态栏显示时的文本
        builder.setTicker("在状态栏上显示的文本")
        //设置优先级,影响出现在通知栏的排序
        builder.priority = NotificationCompat.PRIORITY_HIGH
        //设置显示的时间,可以自定义
        builder.setWhen(System.currentTimeMillis())
        //true代表正在进行的通知,此时用户无法清除通知
        builder.setOngoing(true)

        //设置消息的提醒方式,震动提醒:DEFAULT_VIBRATE     声音提醒:NotificationCompat.DEFAULT_SOUND
        //三色灯提醒NotificationCompat.DEFAULT_LIGHTS     以上三种方式一起:DEFAULT_ALL
        builder.setDefaults(NotificationCompat.DEFAULT_SOUND)
        //设置震动方式,延迟零秒,震动一秒,延迟一秒、震动一秒
        builder.setVibrate(longArrayOf(0, 1000, 1000, 1000))

        val intent = Intent(this, ShowActivity::class.java)
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        //设置意图
        builder.setContentIntent(pendingIntent)

        val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.notify(id, builder.build())

    }

这是之前写的介绍Notifications的文章,虽然是kotlin语言,运行还是很好,但是如果我们在Oreo设备上运行(8.0,API 26或8.1,API 27),则不会出现通知。而且,如果我们在Android Studio中查看代码,我们可以看到Builder 已经被弃用,lint也给我们指出错误。

lint
废弃

从奥利奥8.0(API 26)开始,所有通知必须关联到通道,否则将不会显示。我们在代码中使用的Builder构造函数是Oreo之前不支持Channels的构造函数,因此它被弃用。

在奥利奥通知必须归入通知渠道(Notification Channels)是方便用户更好地控制他们看到的通知。这里的控制指以下几个属性:

当用户修改任何下列特性的行时,修改将作用于通知渠道:

  • 重要性
  • 声音
  • 灯光
  • 振动
  • 在锁屏上显示
  • 替换免打扰模式

下面在奥利奥上创建一个渠道通知:

 fun createNotificationChannel() {
        val id = 0x6e
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)as NotificationManager

        // 通知渠道的id
        val channelId = "渠道ID"
        // 用户可以看到的通知渠道的名字.
        val channelName = "渠道名字"
        // 用户可以看到的通知渠道的描述
        val channelDesc = "渠道描述"
        // 优先级
        val importance = NotificationManager . IMPORTANCE_HIGH;

        val channel =  NotificationChannel(channelId, channelName, importance)

        // 配置通知渠道的属性
        channel.description = channelDesc
        // 设置通知出现时红色闪灯
        channel.enableLights(true)
        channel.lightColor = Color.RED

        notificationManager.createNotificationChannel(channel)

        val notification =  Notification.Builder(this,channelId)
                .setContentTitle("我是标题")
                .setContentText("我是内容")
                .setSmallIcon(R.mipmap.comments)
                .build()

        notificationManager.notify(id,notification)
    }
弹出的样式
点开

右边的switch滑动关闭,点击下面的完成,不能再收到这类通知。

所有类别

在所有类别里设置属性。

如果创建了2个通知 ,2个channel,其中2个channel的id一样,那么后创建的channel会覆盖前一个。显示2个通知,一个渠道。

更新通知渠道设置

一旦创建了通知渠道,其设置和行为就由用户掌控,如果用户对通知设置过,可以通过getNotificationChannel(id)来获取channel的状态。如果想让用户更改回来,需要提供通知渠道的 ID 和应用的包名。如下代码会跳转到渠道的设置页面:

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

设置

如果测试过渠道,即使换了渠道id也会就会保留在应用中,所以需要删除渠道名,或者卸载应用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容