8.0 以下的通知栏讲解,请参考:
Android 消息通知栏用法详解(一)
上篇中,我们学习了8.0 以下的 通知栏常用用法。但8.0之后,google 又引入了 channel 的概念来管理通知栏,避免一拿起手机一大堆通知占着屏幕,谁看谁难受。
什么是channel 呢,意思就是每条通知都对应一个channel,每个 app 都能创建,但这些管理管理权限又都在用户手上。现在让我们一起来学习一下,如何适配 8.0 吧。
一、 适配8.0
如果要适配 Android 8.0 ,还需要添加 NitificationChannel,根据文档,我们可以这样写:
String CHANNEL_ID = "chat";
//适配8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"聊天信息",
NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
NotificationChannel 有三个参数是必填的。
- id : channel_id,这个是channel 的唯一标识
- name : 在 appinfo 中给用户看的
- importance : 重要程度,这里选择默认的即可
这段代码写在哪里都行,只有在 mannager.notiify() 之前即可,以后每次创建代码系统都会去检测该通知的通道是否存在了,因此不会重复创建。
同样,因为上面的属性,当我们设置完channel之后,下次如果想修改一些属性,比如震动、声音,就需要先删掉这个 channel_id,重新创建才会生效。不然 系统会把它重新捞起来,你设置的属性并没有成功。你可以直接删掉或者改 channel_id 也可以的。
接着说说 importance ,它的常见4个优先级如下:
- MPORTANCE_HIGH :紧急,发出提示音,并以浮动通知的形式显示,让用户立即看到
- IMPORTANCE_DEFAUL:高,发出提示音
- IMPORTANCE_LOW:中,不发出提示音
- IMPORTANCE_MIN:最小,不发出提示音,且不会在状态栏显示
这样,最终我们的代码修改为
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String CHANNEL_ID = "chat";
//适配8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"聊天信息",
NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
/**
* 注意写上 channel_id,适配8.0,不用担心8.0以下的,找不到 channel_id 不影响程序
*/
mBuilder = new NotificationCompat.Builder(this,CHANNEL_ID)
.setContentTitle("这是标题")
.setContentText("我是内容,我是demo")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
//通过 builder.build() 拿到 notification
mNotificationManager.notify(1, mBuilder.build());
也可以通过
channel.setDescription("需要开启此权限才能与他人聊天");
设置 channel 的描述信息。
可以看到,在 8.0 的手机上显示出来了。如何知道,channel 的信息呢,长按app 的图标,进入 appInfo,找到 notification 就可以看到了:
二、设置渠道
上面说到,渠道一旦设置了,用户有权去改动它,比如关闭声音通知,那我们怎么知道呢?
如果想了解用户对您的通知渠道所应用的设置,请按以下步骤操作:
- 通过调用 getNotificationChannel() 或 getNotificationChannels() 获取 NotificationChannel 对象。
- 查询特定的渠道设置,例如 getVibrationPattern()、getSound() 和 getImportance()。
比如,我们把刚才聊天的通知,长按关闭。
接着,我们使用 getImportance() 拿到 它的importance。
NotificationChannel channel = mNotificationManager.getNotificationChannel(CHANNEL_ID);
int importance = channel.getImportance();
当检测到 用户关闭时,可以通过 ACTION_CHANNEL_NOTIFICATION_SETTINGS 操作的 Intent 打开通知渠道的系统设置。如:
//如果被关闭了,
if (importance == NotificationManager.IMPORTANCE_NONE) {
Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
startActivity(intent);
}
如:
删除渠道
可以通过调用 deleteNotificationChannel() 删除通知渠道。
注意:通知设置屏幕会显示已删除渠道的数量,以此作为一项垃圾内容防范机制。