关于Andorid Notification Channel(Android8.0 通知渠道)内容学习笔记

  • Date: MM/DD/YYYY
  • Auther: HABIN
  • 设备: AS模拟器7.1.1 AS模拟器9.0

ℹ️NOTE
写通知渠道用的原因是自己在改官方系统时钟7.1.1(从aosp7.1.1上拉下来的)然后运行到9.0 遇到所有时钟通知都会主动弹出(需求有些不需要主动弹出),一开始以为是通知优先级内容setPriority设置问题(8.0以下确实是这个方法控制),后面发现是渠道的原因,记录这篇是为了方便以后翻阅 本文内容基于官方内容整理https://developer.android.google.cn/guide/topics/ui/notifiers/notifications#importance
:

通知渠道

从 Android 8.0(API 级别 26)开始, 所有通知都必须分配到相应的渠道,否则通知将不会显示。对于每个渠道,可以单独设置是否显示,是否响铃,设置响铃等。然后,用户可以更改这些设置,并确定应用中的哪些通知渠道应具有干扰性或应该可见。

文章应用NotificationChannelDemo是一个demo,用kotlin语言写的 链接在文章最后 有兴趣可以从github拉下来看看

Android8.0与7.1以下区别

1)Android7.1.1以下

界面入口的话基本都是一样 找到当前app应用信息界面,找到通知列表,可以看到所有通知都是统一管理,设置阻止 所有组织 设置不发出声音所有都不能发出声音

在这里插入图片描述
Android7 - 创建通知的方式
//这段代码Demo中没有的
    var mNotificationManager:NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    val notification = NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_small_notify)//通知图标
            .setContentTitle(title)//标题
            .setContentText(content)//通知内容
            //.setPriority(NotificationCompat.PRIORITY_DEFAULT)//如果不舍 默认是PRIORITY_DEFAULT 这里就是与Android8.0+渠道不同的地方
    //真正发起通知 这里两个参数 第一个参数就是标识这个通知 
    //如果要手动代码关闭当前通知 就需要这个notificationId来取消 调用方法					   mNotificationManager.cancel(0/*id*/)
   // 第二个参数就是通知内容
    mNotificationManager.notify(0,notification.build())

2)Android8.0+(下面设备是9.0的模拟器)

9.0也是一样 找到当前
在这里插入图片描述

Android8+ 创建通知的方式

这里是demo中主要内容的代码 渠道类别有几种 这里我只展示了常用的两种 这里只是命名而已 可以随意写id 与name的内容 只是为了标识
NotificationChannel(String id, CharSequence name, int importance) 类就是创建渠道的,id就是渠道id,每新增一条通知就需要配置相应的渠道id,name用户应用通知详情渠道列表的名字,importance参数就是本文的重点 渠道重要性 控制着通知是否能够显示 能够弹窗 有提示音。

/**
 * 通知渠道 大部分厂家通知渠道归类通知类别
 * channelId 这个是一个标识  Android8.0+每个通知都要加这个channelId标识重要程度 是否弹窗 是否通知 是否发出声音
 * channelName 这个可以自己随意命名定义 安装后 到当前应用详情通知功能看到这个名字 创建多少个渠道就有多少条,
 *              用于手机查看每个通知渠道 这是用于用户可以单独设置每个通知渠道的显示程度
 * TIP: 同一种重要程度渠道可以创建多个,channelID 和channelName设置不同就行 这里我只写了官方重要级别到几种
 * */
 
//IMPORTANCE_HIGH 紧急:发出提示音,并以浮动通知的形式显示
const val HIGH_CHANNEL_ID: String = "highChannelId"
const val HIGH_CHANNEL_NAME: String = "紧急通知"
//IMPORTANCE_LOW 中: 显示通知但不发出提示音
const val LOW_CHANNEL_ID: String = "lowChannelId"
const val LOW_CHANNEL_NAME: String = "中通知"

 var mNotificationManager:NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
 val highChannel = NotificationChannel(
                HIGH_CHANNEL_ID,
                HIGH_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_HIGH//真正设置通知重要性级别就是这个参数
            )
            //需要几个通知就创建多少个NotificationChannel
            mNotificationManager.createNotificationChannel(highChannel)
               //中通知
 val lowChannel = NotificationChannel(
                LOW_CHANNEL_ID,
                LOW_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_LOW
            )
            mNotificationManager.createNotificationChannel(lowChannel)
   
    var highNotification = NotificationCompat.Builder(this, HIGH_CHANNEL_ID)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle("紧急通知标题")
            .setContentText("紧急通知内容")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
       var lowNotification = NotificationCompat.Builder(this, LOW_CHANNEL_ID)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle("中通知标题")
            .setContentText("中通知内容")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
      //发起两个通知
      mNotificationManager.notify(0,highNotification.build())
  	  mNotificationManager.notify(1,lowNotification.build())

当createNotificationChannel()初始化后 在应用通知列表中就会显示两个渠道
在这里插入图片描述
下面是demo中点击后弹窗级别显示
在这里插入图片描述
表 1. 渠道重要性级别

用户可见的重要性级别重要性(Android 8.0 及更高版本)优先级(Android 7.1 及更低版本)
紧急 :发出提示音,并以浮动通知的形式显示IMPORTANCE_HIGHPRIORITY_HIGH 或 PRIORITY_MAX
高 :发出提示音IMPORTANCE_DEFAULTPRIORITY_DEFAULT
中 :无提示音IMPORTANCE_LOWPRIORITY_LOW
低 :无提示音,且不会在状态栏中显示。IMPORTANCE_MINPRIORITY_MIN

demo中重点代码

/***
 * author : habin
 * time : 2022/04/27
 * desc :
 */
class NotificationBuilder {

    val TAG: String = "NotificationBuilder"
    fun builderNotify(
        context: Context,
        channelId: String,
        title: String = "通知标题",
        content: String = "通知内容!!!!!",
        pri: Int = NotificationCompat.PRIORITY_DEFAULT
    ): Notification {
        Log.d(TAG, "builderHighNotify: 添加通知")
        val notification = NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_small_notify)
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(pri)
        return notification.build()
    }

    fun builderHighNotify(
        context: Context,
        title: String = "紧急通知标题",
        content: String = "紧急通知内容!!!!!",
        pri: Int = NotificationCompat.PRIORITY_DEFAULT
    ): Notification {
        Log.d(TAG, "builderHighNotify: 添加紧急通知")
        val notification = NotificationCompat.Builder(context, HIGH_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_small_notify)
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(pri)
        return notification.build()
    }

    fun builderDefaultNotify(
        context: Context,
        title: String = "高通知标题",
        content: String = "高通知内容!!!!!",
        pri: Int = NotificationCompat.PRIORITY_DEFAULT
    ): Notification {
        Log.d(TAG, "builderHighNotify: 添加高通知")
        val notification = NotificationCompat.Builder(context, DEFAULT_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_small_notify)
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(pri)
        return notification.build()
    }

    fun builderLowNotify(
        context: Context,
        title: String = "中通知标题",
        content: String = "中通知内容!!!!!",
        pri: Int = NotificationCompat.PRIORITY_DEFAULT
    ): Notification {
        Log.d(TAG, "builderHighNotify: 添加中通知")
        val notification = NotificationCompat.Builder(context, LOW_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_small_notify)
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(pri)
        return notification.build()
    }

    fun builderMinNotify(
        context: Context,
        title: String = "低通知标题",
        content: String = "低通知内容!!!!!",
        pri: Int = NotificationCompat.PRIORITY_DEFAULT
    ): Notification {
        val notification = NotificationCompat.Builder(context, MIN_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_small_notify)
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(pri)
        return notification.build()
    }


}
/**
 * 通知渠道 大部分厂家通知渠道归类通知类别
 * channelId 这个是一个标识  Android8.0+每个通知都要加这个channelId标识重要程度 是否弹窗 是否通知 是否发出声音
 * channelName 这个可以自己随意命名定义 安装后 到当前应用详情通知功能看到这个名字 创建多少个渠道就有多少条,
 *              用于手机查看每个通知渠道 这是用于用户可以单独设置每个通知渠道的显示程度
 * TIP: 同一种重要程度渠道可以创建多个,channelID 和channelName设置不同就行 这里我只写了官方重要级别到几种
 * */
//IMPORTANCE_HIGH 紧急:发出提示音,并以浮动通知的形式显示
const val HIGH_CHANNEL_ID: String = "highChannelId"
const val HIGH_CHANNEL_NAME: String = "紧急通知"

//IMPORTANCE_DEFAULT 高:发出提示音
const val DEFAULT_CHANNEL_ID: String = "defaultChannelId"
const val DEFAULT_CHANNEL_NAME: String = "高通知"

//IMPORTANCE_LOW 中: 显示通知但不发出提示音
const val LOW_CHANNEL_ID: String = "lowChannelId"
const val LOW_CHANNEL_NAME: String = "中通知"

//IMPORTANCE_MIN 低: 无提示音,且不会在状态栏中显示
const val MIN_CHANNEL_ID: String = "minChannelId"
const val MIN_CHANNEL_NAME: String = "低通知"


/**
 * TODO:
 * 增加这个紧急2通知 是想说明下渠道id name不是唯一的 可以创建多个紧急渠道
 * 像企业微信 多个紧急通知 比如新消息通知 新邮件提醒等 高通知也有多个这样
 * 需要多少个就创建多少个通知渠道(通知类别)这里我就不创建了
 *     val high2Channel = NotificationChannel(HIGH2_CHANNEL_ID,HIGH2_CHANNEL_NAME,
 *     NotificationManager.IMPORTANCE_HIGH)
 *     mNotificationManager.createNotificationChannel(high2Channel)
 */
const val HIGH2_CHANNEL_ID: String = "high2ChannelId"
const val HIGH2_CHANNEL_NAME: String = "紧急2通知"


/***
 * author : habin
 * time : 2022/04/27
 * desc : 通知渠道管理模块
 */
class NotifyManager(context: Context) {

    var mNotificationManager:NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    init {
        val TAG = "NotifyManager"
        Log.e(TAG, "初始化通知渠道: " )
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //紧急通知
            val highChannel = NotificationChannel(
                HIGH_CHANNEL_ID,
                HIGH_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_HIGH
            )
            mNotificationManager.createNotificationChannel(highChannel)
            //高通知通知
            val defaultChannel = NotificationChannel(
                DEFAULT_CHANNEL_ID,
                DEFAULT_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_DEFAULT
            )
            mNotificationManager.createNotificationChannel(defaultChannel)
            //中通知
            val lowChannel = NotificationChannel(
                LOW_CHANNEL_ID,
                LOW_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_LOW
            )
            mNotificationManager.createNotificationChannel(lowChannel)
            //低通知
            val minChannel = NotificationChannel(
                MIN_CHANNEL_ID,
                MIN_CHANNEL_NAME,
                NotificationManager.IMPORTANCE_MIN
            )
            mNotificationManager.createNotificationChannel(minChannel)
        }
    }

    companion object {
        @Volatile
        var instance: NotifyManager? = null

        fun getInstance(context: Context): NotifyManager {
            if (instance == null) {
                synchronized(NotifyManager::class) {
                    if (instance == null) {
                        instance = NotifyManager(context)
                    }
                }
            }
            return instance!!
        }
    }

    fun addNotify(notification: Notification,notifyId:Int = 0) {
        mNotificationManager.notify(notifyId,notification)
    }

    /**
     * 取消所有通知
     * */
    fun cancelAllNotify(): Unit {
        with(mNotificationManager) {
           cancelAll()
        }
    }

}

项目链接

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingeho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值