美文网首页我爱编程
Oreo Notifications: Channels

Oreo Notifications: Channels

作者: A_si | 来源:发表于2018-04-14 09:13 被阅读115次

    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也会就会保留在应用中,所以需要删除渠道名,或者卸载应用。

    相关文章

      网友评论

        本文标题:Oreo Notifications: Channels

        本文链接:https://www.haomeiwen.com/subject/vtyqkftx.html