Android Notification适配
背景
最近项目App 在Android 8.0上默认不显示通知,查了一下原因,是因为通知设置的级别太低。同时由于Android 8.0以上会列出相应的渠道名称,发现我们的渠道名称居然设置成了发起通知对应的Service的名称,借此契机,就来写一下通知相关的东西,主要从以下几个方面着手:
- 通知的使用;
- 基本使用方法
- 扩展使用方法
- 通知适配要注意的问题;
- 通知系统其它组件结合使用;
- 通知常用的一些操作;
通知的使用
基本使用
通知五常用要素
- 通知小图标,通过
setSmallIcon
设置; - 通知标题,通过
setContentTitle
设置; - 通知内容,通过
setContentText
设置; - 通知点击跳转处理,通过
setContentIntent
来设置(通常需要构建一个PendingIntent来实现); - 通知优先级,Android 7.0以下通过
setPriority()
来设置,Android 8.0以上需要通过构建的NotificationChannel的setImportance()
来设置。
扩展使用
通知除了支持以上基础的设置外,还可以支持如下配置:
- 自定义通知视图(应用后就无法为通知添加Action了);
- 创建可扩展的通知,主要是通过为通知配置不同的样式,目前支持一下样式:
- BigPictureStyle
- BigTextStyle
- InboxStyle,最多展示6行,须记住通知的id,然后调用addLine方法;
- MessagingStyle,聊天对话样式,须记住通知的id,然后调用addMessage方法;
- MediaStyle,多媒体样式(这个样式support库28.0.0不支持,需要使用AndroidX支持库)
通知适配要注意的问题
通知适配时需要注意一下问题。
- 在Api<16版本中,可以直接通过
new
来实例化一个通知对象,然后配置其属性; - 在Api>=16版本中,则需要通过NotificationCompat.Builder来配置并实例化通知对象,这里的NotificationCompat.Builder最好采用最新的support库(28.0.0)或者直接用androidX库,因为它做好了各个版本间的兼容处理;如果没有采用支持库,则需要自己代码中根据版本判断来判断采用哪个版本的Builder来创建Notification对象。
- Android 8.0 以上(Api>= 26)通知使用时必须采用NotificationChannel形式来进行,同时原来通过Builder来配置的一些通知属性改为通过NotificationChannel来设置,如呼吸灯、是否震动、通知音效等。
- 通知的部分配置,如addAction()、setStyle()等,在不同系统上表现不同,在Android 6.0以下添加额外的Action和Style无效。
通知系统其它组件结合使用
- 通知的PendingIntent配置问题,PendingIntent的创建方式有如下几种:
- getActivity()、getActivities()、getBroadcast()、getService(),分别得到可以 start Activity、send broadcase 、start service 的PendingIntent;
- 通过 startService启动的Service,调用startForground可以使Service运行于前台;默认启动的Service都是运行于background的;
- 利用通知来展示带进度的更新内容时,需要知道最初的notifyId,同时还要设置好相应的PendingIntent的Flag值
自定义通知栏的实现
大多数音乐播放器后台播放音乐时,都有一个自定义的通知栏,这个通知栏通常包括上一首、播放/暂停、下一首等功能,这些可以通过自定义通知栏来实现。
自定义通知栏遇到的问题
- 快速切换通知栏的上一首下一首,由于远程调用,可能存在界面更新不及时的问题;
- 不同系统版本的通知栏需要有不同的布局,因为不是所有版本都支持大通知栏样式;
参考文章:
通知适配常见问题:
- 大图小图模式 适配(大通知样式高不超过256dp为妙,小通知样式高度不超过64dp为妙)
- Android 8.0以下通知栏需要单独适配,以高度不超过64dp为妙
- 更新RemoveViews的方法最好通过Handler来进行延时处理,以最后一次更新为标准;