美文网首页我爱编程
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