Android 适配——Notification适配指南

https://rainmonth.github.io/posts/A210906.html

Android Notification适配

背景

最近项目App 在Android 8.0上默认不显示通知,查了一下原因,是因为通知设置的级别太低。同时由于Android 8.0以上会列出相应的渠道名称,发现我们的渠道名称居然设置成了发起通知对应的Service的名称,借此契机,就来写一下通知相关的东西,主要从以下几个方面着手:

  • 通知的使用;
    • 基本使用方法
    • 扩展使用方法
  • 通知适配要注意的问题;
  • 通知系统其它组件结合使用;
  • 通知常用的一些操作;

通知的使用

基本使用

通知五常用要素

  1. 通知小图标,通过setSmallIcon设置;
  2. 通知标题,通过setContentTitle设置;
  3. 通知内容,通过setContentText设置;
  4. 通知点击跳转处理,通过setContentIntent来设置(通常需要构建一个PendingIntent来实现);
  5. 通知优先级,Android 7.0以下通过setPriority()来设置,Android 8.0以上需要通过构建的NotificationChannel的setImportance()来设置。

扩展使用

通知除了支持以上基础的设置外,还可以支持如下配置:

  1. 自定义通知视图(应用后就无法为通知添加Action了);
  2. 创建可扩展的通知,主要是通过为通知配置不同的样式,目前支持一下样式:
    1. BigPictureStyle
    2. BigTextStyle
    3. InboxStyle,最多展示6行,须记住通知的id,然后调用addLine方法;
    4. MessagingStyle,聊天对话样式,须记住通知的id,然后调用addMessage方法;
    5. MediaStyle,多媒体样式(这个样式support库28.0.0不支持,需要使用AndroidX支持库)

通知适配要注意的问题

通知适配时需要注意一下问题。

  1. 在Api<16版本中,可以直接通过new来实例化一个通知对象,然后配置其属性;
  2. 在Api>=16版本中,则需要通过NotificationCompat.Builder来配置并实例化通知对象,这里的NotificationCompat.Builder最好采用最新的support库(28.0.0)或者直接用androidX库,因为它做好了各个版本间的兼容处理;如果没有采用支持库,则需要自己代码中根据版本判断来判断采用哪个版本的Builder来创建Notification对象。
  3. Android 8.0 以上(Api>= 26)通知使用时必须采用NotificationChannel形式来进行,同时原来通过Builder来配置的一些通知属性改为通过NotificationChannel来设置,如呼吸灯、是否震动、通知音效等。
  4. 通知的部分配置,如addAction()、setStyle()等,在不同系统上表现不同,在Android 6.0以下添加额外的Action和Style无效。

通知系统其它组件结合使用

  1. 通知的PendingIntent配置问题,PendingIntent的创建方式有如下几种:
    1. getActivity()、getActivities()、getBroadcast()、getService(),分别得到可以 start Activity、send broadcase 、start service 的PendingIntent;
  2. 通过 startService启动的Service,调用startForground可以使Service运行于前台;默认启动的Service都是运行于background的;
  3. 利用通知来展示带进度的更新内容时,需要知道最初的notifyId,同时还要设置好相应的PendingIntent的Flag值

自定义通知栏的实现

大多数音乐播放器后台播放音乐时,都有一个自定义的通知栏,这个通知栏通常包括上一首、播放/暂停、下一首等功能,这些可以通过自定义通知栏来实现。

自定义通知栏遇到的问题

  1. 快速切换通知栏的上一首下一首,由于远程调用,可能存在界面更新不及时的问题;
  2. 不同系统版本的通知栏需要有不同的布局,因为不是所有版本都支持大通知栏样式;

参考文章:

Android Notification 版本适配方案

通知适配常见问题:

  1. 大图小图模式 适配(大通知样式高不超过256dp为妙,小通知样式高度不超过64dp为妙)
  2. Android 8.0以下通知栏需要单独适配,以高度不超过64dp为妙
  3. 更新RemoveViews的方法最好通过Handler来进行延时处理,以最后一次更新为标准;