Android 8.0通知栏(Notification)适配

目录

      • 这里我们分步解题:
        • 第一步:判断API
        • 第二步:NotificationChannel
        • 第三步:Notification第二个参数
      • 代码对比:
        • 拓展

这几天做一个小软件在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

Android 8.0通知栏(Notification)适配_第1张图片

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);

你可能感兴趣的:(Android)