当前位置: 首页 > news >正文

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

相关文章:

Android弹出通知

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

如何用 UDP 实现可靠传输?并以LabVIEW为例进行说明

UDP(用户数据报协议)本身是一个无连接的、不可靠的传输协议,它不提供数据包的到达确认、排序保证或重传机制。因此,如果要在UDP上实现可靠传输,就需要在应用层引入额外的机制。以下是一些常见的方法: 确认和…...

【任职资格】某大型商业金融银行任职资格体系搭建项目纪实

【客户背景】某大型商业金融银行位于南方某省,成立于上个世纪九十年代,是一家具有独立法人资格的股份制商业银行,经过多年发展,下辖20多家分行,近200多个营业网点,并于21世纪初成功上市,规模不断…...

如何利用IP地址分析风险和保障网络安全

随着网络攻击的不断增加和演变,保障网络安全已经成为了企业和组织不可忽视的重要任务。在这样的背景下,利用IP地址分析风险和建立IP风险画像标签成为了一种有效的手段。本文将深入探讨IP风险画像标签的作用以及如何利用它来保障网络安全。 IP风险画像查…...

轧钢自动化中的智能仪器:监控、控制和优化新视角

摘要:轧钢自动化是现在及未来的发展趋势,而自动化的轧钢发展,更是离不开形形色色的智能仪器,本文来看看那些应用于轧钢生产中的测量仪。 关键词:智能仪器,在线测量仪,测径仪,测宽仪,测厚仪,测长仪,工业数据分析采集软件…...

第十四届蓝桥杯省赛C++B组题解

考点 暴力枚举&#xff0c;搜索&#xff0c;数学&#xff0c;二分&#xff0c;前缀和&#xff0c;简单DP&#xff0c;优先队列&#xff0c;链表&#xff0c;LCA&#xff0c;树上差分 A 日期统计 暴力枚举&#xff1a; #include<bits/stdc.h> using namespace std; int …...

语音控制模块_雷龙发展

一 硬件原理 1&#xff0c;串口 uart串口控制模式&#xff0c;即异步传送收发器&#xff0c;通过其完成语音控制。 发送uart将来自cpu等控制设备的并行数据转换为串行形式&#xff0c;并将其串行发送到接收uart&#xff0c;接收uart然后将串行数据转换为接收数据接收设备的并行…...

idea 开发serlvet班级通讯录管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 班级通讯录管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 servlet 班…...

Python高级语法

Python高级语 1 列表推导式1.1 什么是列表推导式1.2 列表推导式的使用 2 字典推导式2.1 什么是字典推导式2.2 字典推导式的使用 3 元组推导式4 集合推导式5 三元表达式5.1 什么是三元表达式5.2 三元表达式的使用 1 列表推导式 1.1 什么是列表推导式 列表推导式的英文&#xf…...

HTML5语义化元素

在HTML5之前&#xff0c;网站的分布层级有哪些呢&#xff1f; nav&#xff0c;header&#xff0c;main&#xff0c;footer 这样做有一个弊端 我们往往过多的使用div&#xff0c;通过ID或class来区分元素 对于浏览器来说这些元素不够语义化 对于我来说搜索引擎来说&#xff0c;不…...

Android 性能优化——APP启动优化

一、APP启动流程 首先在《Android系统和APP启动流程》中我们介绍了 APP 的启动流程&#xff0c;但都是 FW 层的流程&#xff0c;这里我们主要分析一下在 APP 中的启动流程。要了解 APP 层的启动流程&#xff0c;首先要了解 APP 启动的分类。 1、启动分类 冷启动 应用从头开始…...

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…...

【NLP11-迁移学习】

1、了解迁移学习中的有关概念 1.1、预训练模型&#xff08;pretrained model) 一般情况下预训练模型都是大型模型&#xff0c;具备复杂的网络结构&#xff0c;众多的参数量&#xff0c;以及在足够大的数据集下进行训练而产生的模型。在NLP领域&#xff0c;预训练模型往往是语…...

Android11 FallbackHome启动和关闭流程分析

Android 7.0引入了新特性&#xff1a;Direct Boot Mode&#xff0c;设备启动后进入的一个新模式&#xff0c;直到用户解锁&#xff08;unlock&#xff09;设备此阶段结束。在这个模式下&#xff0c;系统调用 resolveHomeActivity 找到的是FallbackHome &#xff0c;而不是我们的…...

elasticsearch-java api 8 升级

es client api 升级 背景 公司项目从sring-boot2 升级到了spring-boot3 &#xff0c;es的服务端也跟着升级到了es8 &#xff0c;而es的客户端7和服务端8 是不兼容的&#xff0c; 客户端es 7使用的是&#xff1a; elasticsearch-rest-high-level-client es 8 升级到&#xf…...

HCIA_IP路由基础问题?

目录 1. 什么是路由&#xff1f;2. 什么是路由器&#xff1f;3. 什么是路由信息&#xff1f;4. 路由器信息和路由表的区别&#xff1f;5. 路由表的生成方式&#xff1f;6.直连路由生效条件是什么&#xff1f;7.Inloopback0是什么接口&#xff1f;8.最优路由选择的原则&#xff…...

(黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_01&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——保护 今日目标1.初识Sentinel1.1.雪崩问题及解决方案1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.…...

高架学习笔记之信息系统分类概览

目录 零、前言 一、业务处理系统(TPS) 概念 功能 特点 二、管理信息系统(MIS) 概念 功能 组成 三、决策支持系统(DSS) 概念 功能 特点 组成 1. 数据仓库 2. 数据挖掘工具 3. 决策模型 4. 可视化界面 四、专家系统(ES) 概念 特点 组成 求解过程 专家系统…...

2023新版mapinfo美化电子地图 新版2013Arcgis shp电子地图 下载

2023新版MapInfo和电子地图美化&#xff0c;以及2013版ArcGIS的SHP电子地图设计&#xff0c;是地理信息系统&#xff08;GIS&#xff09;领域中的两个重要话题。下面将分别对这两个主题进行描述。 样图&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WB4AGsycyBGagVq5…...

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码&#xff1a;a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...