这几天做一个小软件在API28(Android 9.0)的模拟器上测试时,发现通知栏无效,经过一番查询,了解到:API26(Android 8.0)以后,引入了**通知渠道(Notification Channels)**这么一个东西来帮助用户管理通知。
并且,这个通知渠道(Notification Channels)在API26(Android 8.0)以下的Android设备上运行是会崩溃的,所以这里我再次踩坑在低版本Android设备上崩溃了…
这里我们分步解题:
第一步:判断API
我们需要通过判断当前设备的API来针对性的进行发送通知栏
if (Build.VERSION.SDK_INT >= 26) {
//这里是API26以上的方法
} else {
//这里是API26以下的方法
}
第二步:NotificationChannel
NotificationChannel三个参数:
ID:通知渠道的 ID ,用户不可见,实例化Notification的时候需要用到,如果这个 ID 在实例化Notification的时候没有对应上,通知栏无效,系统还会Toast弹出一个错误*(软件不会闪退)*
Name:这个是便于用户管理通知用的,用户可见,如图:“小词典温馨提示” 就是我设置的 Name
Importance:渠道优先级
实例化一个NotificationChannel对象,然后NotificationManager对象调用一下createNotificationChannel()方法并传入NotificationChannel对象
NotificationChannel channel = new NotificationChannel(ID, NAME, NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
第三步:Notification第二个参数
实例化Notification对象,并传入 id
Notification notification = new Notification.Builder(context, ID)
相对于API26以前的使用只多 2 行代码,后面的就和API26之前的通知栏一样了,这里也同时在告诉我们,知识要不断更新才稳得住啊,不然就会和我一样,在无限的闪退和报错之中迷失了方向~
代码对比:
NotificationManager manager = (NotificationManager) .getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= 26) {//这里是API26以上的方法
NotificationChannel channel = new NotificationChannel(ID, NAME, NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(context, ID)
.setContentTitle(title)
.setContentText(msg)
.setSmallIcon(R.mipmap.img_icon)
.build();
manager.notify(1, notification);
} else {//这里是API26以下
Notification notification = new Notification.Builder(context)
.setContentTitle(title)
.setContentText(msg)
.setSmallIcon(R.mipmap.img_icon)
.build();
manager.notify(1, notification);
}
拓展
这里拓展一个API15之前的通知栏(Notification)用法,以前踩的坑,现在基本用不上,也可以了解:这里是把Notification.build()改成了.getNotification(),其他也是没有变化
Notification notification = new Notification.Builder(context)
.setContentTitle(title)
.setContentText(msg)
.setSmallIcon(R.mipmap.img_icon)
.setAutoCancel(true)
.setColor(Color.GREEN)
.getNotification();//API15以及以下修改这里即可
manager.notify(1, notification);
转载:https://blog.csdn.net/qq_44720366/article/details/105939531
查看评论