前言
Android通知栏是一个比较常用的功能,系统自带的通知栏构建起来比较简单,这里主要总结一下自定义通知栏的构建,自定义的通知栏涉及到背景色的适配,这里主要总结一下网上的适配方法总结记录。
一:适配5.0以上机型
原理:因为系统通知的文字颜色会随着(不同主题的)下拉菜单的背景色变化而变化,该方法设置自定义通知的文字颜色与系统通知的文字颜色相同,从而达到保证文字对比度的目的。
在5.0以上RemoteView加载的xml里面给通知标题文字(TextView)设置
android:textAppearance="@android:style/TextAppearance.Material.Notification.Title"属性
给简介设置
android:textAppearance="@android:style/TextAppearance.Material.Notification.Line2"属性
不要给文字设置颜色,布局不要设置背景色,这个方案参考:这里
在官方文档找到这样一处介绍:
这样可以在不同机型上尽量适配系统的通知标题颜色
二:5.0以下参考方案
5.0以下可以获取android:textAppearance="@style/TextAppearance.StatusBar.EventContent"设置标题,我在适配是提示找不到这个属性,所以5.0以下推荐使用这里提出的利用构建一个不展示的系统通知栏然后遍历获取通知栏title颜色,比较得出当前通知栏背景偏深色还是浅色加载不同的布局,安卓7.0以上不能使用,获取 notification.contentView.getLayoutId()报空指针异常,因为7.0获取contentView是空的,此方案可以兼容7.0以下(如果需要自定义的字体颜色)
注:测试发现RemoteView的布局文件如果设置根布局高度自适应,4.4已经4.2等机型会出现布局顶到通知栏最上面,解决办法固定通知栏高度为64dp,布局居中有效,如果定义大图模式通知栏高度固定256dp。针对5.0以下可以单独写一个layout加载兼容
三:关于通知栏权限
有些厂商会默认禁止通知权限,导致通知栏不能展示,所以需要检测通知栏权限,通过都是利用反射获取AppOpsManager里面的checkOpNoThrow方法拿到,其实v4包在安卓7.0提供了一个方法用来检测:
NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());//利用这个可以检测
boolean isOpened = manager.areNotificationsEnabled();
其实源码里面在7.0以下也是利用反射拿到的,检测也就方便了
剩下的就是引导用户跳转到应用设置界面去手动开启:
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplication().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
以上就死关于自定义通知栏适配网上给出的方案的总结,测试了几款机型都能正常显示,可以根据
这几种方案结合适配,关于直接写死背景色那种适配,感觉不可取,在浅色通知栏会比较难看。