notificationChannel

Android 8.0上的通知栏简单适配

当我们升级到Android O以上,也就是将targetSdkVersion升级到26时,原来的通知方法就是提示被遗弃了,所以我们需要升级下代码了。
Android O上的通知出现了一个通知渠道的概念,也就是每条通知都需要有一个对应的渠道,8.0Google将用户的权利放到最大,用户可以自由的选择是否振铃,是否震动,是否关闭这个渠道的通知。
首先如何使用通知渠道

1
2
3
4
5
6
7
8
9
10
11
12
13
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "subscribe";
String channelName = "订阅消息";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
channel.setShowBadge(true);//通知角标,默认为true
channel.enableLights(true);
channel.enableVibration(true);
//channel.setSound();
NotificationManager notificationManager = (NotificationManager) getSystemService(
NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}

上面就是创建了一个通知渠道,它需要定义一个渠道ID,渠道名称,以及重要性等级,需要注意的是:我们在使用渠道时需要先创建它,而渠道只会创建一次,而且除了(名字,描述,blocksystem,以及优先级),其他的震动,响铃都不能在创建之后修改了,你只能删除这个渠道,重新创建一个。
但是删除的渠道并不会消失,只会被打上一个delete标签。想要彻底删除的话只有清空数据或者卸载应用了,要不下次创建出同样ID的渠道,它只会将原先的delete标签去除,重新启用。

显示一条通知

1
2
3
4
5
6
7
8
9
10
11
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this, "subscribe")
.setContentTitle("订阅消息")
.setContentText("收到一条订阅消息!")
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round))
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setNumber(2)//这个也可以显示通知的角标
.build();
manager.notify(1, notification);

删除通知渠道

1
2
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.deleteNotificationChannel(channelId);

跳转到通知界面提示用户打开通知

当用户主动关掉了通知渠道之后,应用如果必须要让用户打开功能才正常的话,可以使用如下方式打开

1
2
3
4
5
6
7
8
9
10
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = manager.getNotificationChannel("chat");
if (channel.getImportance() == 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);
Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();
}
}

#总结
8.0的通知渠道留给开发者可操控的空间很少,用户掌控着绝对的主动权。通知渠道创建之后无法修改其他重要属性也是必须要知道的。如果应用的targetSdkversion升级到了26,Android系统就认为你已经做好了适配工作,如果不使用通知渠道的话,你的通知可能就无法弹出了。