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