Android弹出通知

发现把Android通知渠道的重要性设置为最高时,当发送通知时,通知能直接弹出来显示,以前一直搞不明白为什么别的app的通知可以弹出来,我的不行,搞了半天原来是这个属性在作怪,示例如下:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {registerForActivityResult(ActivityResultContracts.RequestPermission()) {}.launch(Manifest.permission.POST_NOTIFICATIONS)}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val importance = NotificationManager.IMPORTANCE_HIGHval channel = NotificationChannel("channel_id", "MyChannel", importance)channel.description = "This is my notification channel"NotificationManagerCompat.from(this).createNotificationChannel(channel)}val builder = NotificationCompat.Builder(this, "channel_id").setSmallIcon(R.drawable.icon).setContentTitle("这是通知标题").setContentText("这是通知内容")if (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {NotificationManagerCompat.from(this).notify(1, builder.build())}}}

最主要的是使用了NotificationManager.IMPORTANCE_HIGH常量,其它的随便怎么设置都不重要。运行效果如下:

在这里插入图片描述
如果手机有这个设置需要打开,如下:
在这里插入图片描述
这个选项默认是打开的。如果是关的话通知就不会弹出来。点击通知渠道名称还有一个 “允许打扰” 的选项,如下:
在这里插入图片描述
这个开关默认是关的,但是通知还是能弹出来,而且也有通知声音,振动没试过。在一台不知名的手机上,我试了设置免打扰模式,通知还是能弹出来,只是通知的声音没有了,打开 “允许打扰” 就可以听到通知声音了,这台手机是Android 11版本,可能做的不太规范。

在我的小米手机11pro(Android 13)上,通知设置的主页是这样的:

在这里插入图片描述
这个开关默认也是开的,点击通道名称(MyChannel)之后也有一个一样的权限,默认也是开的,如下:
在这里插入图片描述
当我把主页上的 “悬浮通知权限” 关闭后,通道里的这个开关就不见了,所以,通知主页上的所有开关都是app通知的总开关,对所有频道都生效,所以如果有多个通道频道的话可以针对不同的频道单独设置是否可以弹出通知,比如有一个Linphone应用,我查看它的通知是创建了4个频道的,如下:
在这里插入图片描述

  • Linphone 来电通知:用于显示来电。通过自定义通知的UI,可以在通知上显示接收听电话按钮。如果是平时我们自己做的话估计会使用Dialog来弹窗显示,原来用通知也能实现啊!那如何保持通知弹出来一直显示呢?直到用户点击接听或者挂断按钮。
  • Linphone 即时通讯通知:用于显示消息通知
  • Linphone 未接来电通知:用于显示未接来电
  • Linphone 服务通知:用于在保持应用长期在后台,所以这个服务是以前台服务开启的,这样就必须显示一个常驻消息栏的通知,通知的消息内容为:“若要在后台可接听电话这是必要的”。这个理由很不错,学习了,充分的理由让用户知道这个前台服务的功能,要不然用户可能会关闭掉这个服务(不知道是不是把通知一关服务就关掉了呢?待实验)。

为不同的使用场景创建不同的频道是个比较好的做法,以方便用户有更细的选择,比如,我觉得电话比较重要,我就可以打开 “Linphone 来电通知” 这个渠道中的悬浮窗权限,其它频道的全都关闭。

再来看看微信app的通知渠道:
在这里插入图片描述
可以看到,微信app创建了3个通知频道,一个用于接收新消息,一个用于下载,一个用于音视频通话,在微信app中,我们可以设置消息免打扰,如果我想把所有的微信群都设置为免打扰,无需在app内部设置,最快捷的办法就是在 “新消息通知” 这个通知频道中设置就可以了,比如把这个频道中的所有开关全部关掉,如下:
在这里插入图片描述
“允许通知” 是一个总开关,关掉这个,下面的所有功能都不可用,所以,我们也可以单独设置,比如设置震动,但是不允许声音,如下:
在这里插入图片描述
我发现微信的3个频道中,有两个频道的 “悬浮通知权限” 是开的,有一个是关闭的,这是什么API控制的呢?其实就是创建通知频道时的importance参数控制的,设置为NotificationManager.IMPORTANCE_DEFAULT它默认就是关的,设置为NotificationManager.IMPORTANCE_HIGH它默认就会是开的。所有的常量如下:

public static final int IMPORTANCE_NONE = 0;
public static final int IMPORTANCE_MIN = 1;
public static final int IMPORTANCE_LOW = 2;
public static final int IMPORTANCE_DEFAULT = 3;
public static final int IMPORTANCE_HIGH = 4;
public static final int IMPORTANCE_MAX = 5;

可以看到,DEFAULT 跟 HIGH 就差一个级别。MAX 目前是不可用的,我在代码中使用时IDE直接报错,它的源码注释为:Unused. 使用 MIN 和 LOW 又会有什么不同呢?待实验。

在观看Linphone的源代码时,发现它在发送通知时会先判断一下importance,通过通知频道的ID可以再次获取importance属性,代码如下:

val importance  = notificationManager.getNotificationChannel(channelId)?.importance ?: NotificationManagerCompat.IMPORTANCE_NONE

通过判断 importanceIMPORTANCE_NONE 则认为用户关闭了该通知频道。然后我看到,它设置的前台服务的通知频道使用IMPORTANCE_LOW,来电话时,它默认是使用这个对应的频道来发送通知的,然后判断如果这个频道被用户关闭了的话再用来电通知的那个频道来发消息,而且有提到,如果用户关闭了服务通知频道,然后再打开的话,则这个频道原先是IMPORTANCE_LOW,这样操作后就不是IMPORTANCE_LOW了,这也是一个细节点。我奇怪的是这个频道使用IMPORTANCE_LOW的话,它是如何让通知弹出来的,而且这个通知会一直显示,直到用户按接听或挂断按钮,通知对象中有个方法:setCategory(NotificationCompat.CATEGORY_CALL),不知道是否跟这个有关,有时间再去研究了。这个Linphone的关于通知的源码值得好好去研究,它还有兼容性处理,针对不同的版本有不同的处理。

因为低版本是没有通知频道说法的,所以可以想到在通知渠道的一些方法,比如设置通知声音、通知灯颜色、通知振动等的一些方法在NotificationCompat.Builder中也会有。

有时间真的可以好好研究Linphone的源码,人家还是用Kotlin写的,好多东西值得学习。

以前我一直不知道通知频道的id怎么定义,这时就可以参考一下别人是怎么写的,比如Linphone的,如下:

  • linphone_notification_service_id Linphone服务通知
  • linphone_notification_missed_call_id Linphone未接来电通知
  • linphone_notification_call_id Linphone来电通知
  • linphone_notification_chat_id Linphone即时通讯通知

从这看的话,这个id就是一个普通的字符串,能描述你这个通知频道即可,以后通过这个id可以获取频道对象:notificationManager.getNotificationChannel(channelId)

再来看看别人的频道名称和描述是怎么起的,以后自己就知道应该怎么写了,截图来自于我的小米11pro (Android 13),Linphone的如下:
在这里插入图片描述
可以看到,Linphone的是偷懒做法,名称和描述都写成一样的,但也没什么不可,因为通过名称其实就已经足够了解这个频道是做什么的了,所以名称和描述可以是一样的,但是对于 “Linphone服务通知” 这个是看不出来是做什么的,描述应该更详细一些。

下面是微信的:

在这里插入图片描述
对于不同的频道,有不一样的设置,比如对于 “新消息通知” 的铃声为默认铃声,即系统自带的通知铃声中的默认铃声,对于 “音视频通话邀请通知” 的铃声为显示为 phonering,我在另一手机上看到显示为phonering.mp3,所以小米系统隐藏了文件扩展名,这不是我系统自带的铃声,所以,如何给通知设置一个默认铃声和自定义铃声有时间可以学一下,不只是铃声,通知频道中的所有开关设置都是哪些API控制的都应该掌握。

下面是QQ的:
在这里插入图片描述
不知道为什么QQ的这么特殊,它的通知频道上有一个 “允许通知“ 的开关,用于控制所有的频道,但是最上方还有一个这种开关啊,如下:
在这里插入图片描述
别的app的通知频道列表的标题是 “通知类别”,而QQ的显示为 “消息通知”,这么神奇。另外QQ的通知频道都是只有名称,没有描述,所以描述不是必须的,因此对于前面Linphone的把通知频道的名称和描述写成一样就有点多余了,如果都一样的话只写名称就好了。

下面是美团外卖的:
在这里插入图片描述
天哪竟然这么多!所以,对于那些感觉没用的通知频道我们可以把它给禁用掉。

下面是支付宝的:
在这里插入图片描述

这么神奇,这么大个App竟然没有通知频道,支付宝不用发送通知的吗?我真的好像没在我手机上看到过支付宝的通知。

下面是京东的:

在这里插入图片描述
可以看到,“京东通知” 这个频道竟然有两个,说明通知频道的名称是可以重复的。

下面是今日头条的:
在这里插入图片描述
静默通知?长舍样的,学习下:
在这里插入图片描述
原来就是不弹窗、无声音、无振动、锁屏不显示。

下面是百度地图的:

在这里插入图片描述
下面是哈罗的:
在这里插入图片描述
哈罗的和QQ一样,没有显示 “通知类别”,它的显示为 “哈罗” 和 “其他”,这两个标题下的都是通知频道,刚开始我看到 “不重要”、“普通”,我以为又是一个什么奇怪的设置的,原来只是通知频道的名称而已,这里我有个大胆的猜测,通知频道可以分组,哈罗这里分成了两组,组名分别为 “哈罗” 和 “其他”,但是也有点奇怪,为什么哈罗第一组前面有一个 “允许通知” 的开关可以控制该组,但是 “其他” 这个组中又没有这个开关?是系统Bug吗?还是我理解有误,有时间再来研究。

下面是Edge浏览器的:
在这里插入图片描述
可以看到,Edge也把通知频道分成了两组,跟哈罗不同的是,这里每个组都有一个 “允许通知” 的总开关,分别用于控制每个组,所以我猜想,有分组的频道就会有一个总开关控制,如果同时有分组的也有没分组的,则没分组的会显示到 “其他” 这个类别下,但是由于他们不是一组的,所以没有总开关控制,就像我们一个组也不分时,它显示为 “通知类别”,也是没有总开关控制的。

下面是酷狗音乐的:
在这里插入图片描述
下面是TO DO的:
在这里插入图片描述
这个的感觉就不是很专业了,分的太细了,比如文件传输和文件传输完毕都用一个频道不就完了吗,非要搞成两个频道来发送通知。还有一些奇奇怪的“你今天将处理哪些工作”、“奇妙清单导入完毕”。

OK,看了这么多别人的通知频道的设置了,当我们自己开发的时候,对于通知频道我们应该知道要设置什么以及怎么设置比较合理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户:登录 个人信息 简历信息 查看招聘信息 企业:登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员:注册 登录 管理员…

后端工程师快速使用axios

文章目录 01.AJAX 概念和 axios 使用模板目标讲解代码解析案例前端后端结果截图 02.URL 查询参数模板目标讲解案例前端后端结果截图 03.常用请求方法和数据提交模板目标讲解案例前端后端结果截图 04.axios 错误处理模板目标讲解案例前端后端结果截图 01.AJAX 概念和 axios 使用…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item,必须配合List来使用。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

ASP.NET Core 8.0 WebApi 从零开始学习JWT登录认证

文章目录 前言相关链接Nuget选择知识补充JWT不是加密算法可逆加密和不可逆加密 普通Jwt(不推荐)项目环境Nuget 最小JWT测试在WebApi中简单使用简单使用运行结果 WebApi 授权,博客太老了,尝试失败 WebApi .net core 8.0 最新版Jwt …

笔记本插入耳机没有声音

笔记本插入耳机没有声音,有可能是因为音频设置问题 打开声音小喇叭,选择耳机频道就好了

【Qt图形界面引擎(一)】:第一个Qt程序

跨平台图形界面引擎,接口简单,易上手,一定程度简化内存。 Qt发展史 1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具2012…

数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署

简介 随着数字人物概念的兴起和生成技术的不断发展,将照片中的人物与音频输入进行同步变得越来越容易。然而,目前仍存在一些问题,比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题,来自西安…

【软件工程】一份完整的软件工程实践论文格式

一份完整的软件工程实践论文格式 记录一下,以备不时之需! 目 录 第1章 绪 论 1.1 课题背景 1.2 课题意义 1.3 国内外现状 2 第2章 系统关键技术 4 2.1 开发技术 4 2.2 MVVM模式 4 2.3 MySQL数据库 4 2.4 B/S结构 5 2.5 框架介绍 5 2.6 Vue.js主要功能 6…

sentinel熔断降级

熔断降级 Slot 责任链上的最后一环:熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中,有时需要大屏…

聊聊Go程序是如何运行的

写在文章开头 Go语言是一门编译语言,其工作过程即直接通过编译生成各大操作系统的机器码即可直接执行,所以这篇文章笔者就从底层汇编码的角度聊一聊Go语言是如何运行的。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java c…

IntelliJ IDEA 设置运行时环境变量

背景 博主要测试langchain4j,运行时需要OPENAI_BASE_URL和OPENAI_API_KEY这两个环境变量的值。 临时设置 Run -> Edit Configurations -> Edit Environmental Variables 永久设置 在系统环境变量中设置,教程无数。 注意:windows在…

MATLAB教程

目录 前言一、MATLAB基本操作1.1 界面简介1.2 搜索路径1.3 交互式命令操作1.4 帮助系统 二、MATLAB语言基础2.1 数据类型2.2 MATLAB运算2.2.1 算数运算2.2.2 关系运算2.2.3 逻辑运算 2.3 常用内部函数2.4 结构数据与单元数据 三、MATLAB程序设计3.1 M文件3.2 函数文件3.3 程序控…

c#接口 axios的get请求url过长时该怎么做

今天又碰到了,大托参数拼在url里用get传 1、改服务器最大字数限制(还是会错) 2、改post(有些还要跟着把[FromUri]改成[FromBody])

windows查看局域网内所有已使用的IP IP扫描工具 扫描网段下所有的IP Windows环境下

推荐使用: Advanced IP Scanner 官网下载: https://www.advanced-ip-scanner.com/

sqllab第35-45关通关笔记

35关知识点: 宽字节注入数值型注入错误注入 payload:id1andextractvalue(1,concat(0x7e,database(),0x7e))0--联合注入 payload:id0unionselect1,database(),version()-- 36关知识点: 字符型注入宽字节注入错误注入 payload:id1%df%27andextractvalue(…

广州大彩科技新品发布:大彩科技COF系列2.4寸串口屏发布!

一、产品介绍 此次发布的是S系列平台2.4寸COF超薄结构串口屏,分辨率为240*320,该平台采用了Cortex-M3内核的处理器,内置了2Mbyte PSRAM和64Mbit FLASH,是专为小尺寸串口屏设计的MCU,精简了外围电路。 该平台默认支持大…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展,光伏发电作为清洁能源的重要组成部分,得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区,吸引了众多光伏项目的投资建设。在此背景下,为提高光伏发电项目的运行效率和安全性能&…

【C++】堆区空间的申请和释放--- 2024.3.19

目录 C和C的区别(申请堆区空间)C中的new和delete结束语 C和C的区别(申请堆区空间) 在c语言中,在遇到需要申请一块堆区空间时,我们往往会使用malloc申请,使用free进行释放,但是为什么…

数据可信流通:从运维信任到技术信任

1.数据可信流通概念 "数据可信流通"通常指的是确保数据在不同系统、应用程序或者组织之间的传输和交换过程中的可信性、完整性和安全性。在数据流通的过程中,确保数据的真实性、完整性和保密性是非常重要的,尤其是涉及到敏感信息或者重要数据…