最新版Android13使用Notification,Notification的基本使用和进阶使用

一、使用Notification

1、创建一个通知

1.1 注册一个渠道

在Android13,版本通知的使用发生了新的变化。

首先我们需要创建一个NotificationManager用于管理通知。

//创建notificationManager对通知进行管理
NotificationManager notificationManager = getSystemService(NotificationManager.class);

接下来需要注册一个渠道(channel),通知渠道是一种对通知进行分类和管理的机制。

// 在 MainActivity 或其他合适的地方创建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    String channelId = "001";   //通知渠道的标识符
    CharSequence channelName = "QQ";    //通知渠道的位置
    String channelDescription = "来自QQ好友的消息";    //通知渠道的描述

    //设置通知渠道的级别
    int importance = NotificationManager.IMPORTANCE_DEFAULT;

    //创建通知渠道
    NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
    notificationChannel.setDescription(channelDescription);//可以省略
   

    //在系统中注册消息
    notificationManager.createNotificationChannel(notificationChannel);

}

通过 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 条件判断,确保当前设备运行的 Android 版本是 8.0 或更高版本。只有在这种情况下,通知渠道才会被创建。

然后,定义了三个变量和设置了一个渠道级别用于设置通知渠道的属性:

参数说明
channelId通知渠道的ID,用户不可见,实例化Notification的时候需要用到。
channelName通知渠道的名称,这个是方便用户管理通知用的,用户可见
channelDescription通知渠道的描述。用于在系统设置界面和通知管理中向用户显示通知渠道的详细描述。
importance渠道优先级

渠道的优先级有三种:

  1. IMPORTANCE_DEFAULT:(默认级别)
  2. IMPORTANCE_HIGH:(高)
  3. IMPORTANCE_LOW:(低)
  4. IMPORTANCE_MAX:最重要的通知,系统会立马使得消息显示在屏幕

image-20230802205341946

接下来通过NotificationChannel创建一个渠道,构造方法的三个参数分别是:Id、name、importance。

通过**setDescription()**方法设置渠道的表述消息

最后在系统中注册消息即可:

notificationManager.createNotificationChannel(notificationChannel);

1.2、扩充知识CharSequence

使用 CharSequence 类型的好处在于它是一个通用接口,它可以包含不同类型的字符序列,包括不可变的字符串 String 和可变的字符串 StringBuilderStringBuffer 等。这样,我们在定义通知渠道时,可以使用 CharSequence 类型的变量,允许传递不同类型的字符序列。

1.3 创建通知

注意Android 8以上都需要获取权限

//申请通知权限
if (ContextCompat.checkSelfPermission(MainActivity.this,
                                      Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, 1);
}

还需要在AndroidManifest中进行注册:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

接下来才进行创建通知:

//创建通知
Notification notification = new NotificationCompat.Builder(MainActivity.this, "001")
    .setContentTitle("QQ消息")    //消息的标题
    .setContentText("你好,我是张三")  //消息的内容
    .setWhen(System.currentTimeMillis())    //指定通知被创建的时间
    .setSmallIcon(R.drawable.notify)    //通知的小图标
    .setLargeIcon(BitmapFactory.decodeResource
                  (getResources(), R.drawable.notify)) //通知的大图标
    .build();

//显示一个通知
notificationManager.notify(1, notification);

setLargeIcon() 方法中,需要传递一个 Bitmap 对象作为大图标的内容。这里使用了 BitmapFactory.decodeResource(getResources(), R.drawable.notify) 来将 R.drawable.notify 资源转换成 Bitmap 对象,并将其作为大图标设置给通知。

image-20230802184739177

1.4 为消息设置点击事件

//点击通知后跳转页面
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_IMMUTABLE);

使用PendingIntent,他有四个参数:

image-20230802185336157

  1. 第二个参数一般不会使用,通常传入0
  2. 第三个参数是Intent对象
  3. 第四个参数是一个标志(flag),用于确定意图的行为

有四个值可选通常是FLAG_IMMUTABLE

  • **PendingIntent.FLAG_IMMUTABLE:**这是 Android 12(API 级别 31)及更高版本中引入的标志。创建的 PendingIntent 对象将变为不可变。不可变的 PendingIntent 在创建后就无法修改其内容、标志或其他属性,提高了安全性和性能。

  • **PendingIntent.FLAG_UPDATE_CURRENT:**用于指定如果创建的 PendingIntent 已经存在,那么使用现有的 PendingIntent,并更新其中的 Intent 内容为新传入的 Intent。如果不存在,就创建一个新的 PendingIntent这个标志通常用于在多次创建相同 PendingIntent 的场景,确保只有一个 PendingIntent 实例,并且其中的 Intent 内容保持最新。

  • **PendingIntent.FLAG_CANCEL_CURRENT:**如果创建的 PendingIntent 已经存在,那么将现有的 PendingIntent 取消掉,然后创建一个新的 PendingIntent。即先取消已存在的 PendingIntent,再创建新的。

  • **PendingIntent.FLAG_NO_CREATE:**如果创建的 PendingIntent 已经存在,不会再创建新的 PendingIntent,而是返回已存在的 PendingIntent。如果不存在,返回 null这个标志通常用于查询是否已经存在特定的 PendingIntent,而不会真正创建新的实例

最后使用在创建通知时加上:

.setContentIntent(pi)   //点击后的跳转事件

然后点击这个通知就可以实现跳转了。

通过这个动图,我们发现点击通知后通知依然没有消失,这是为什么?

解决方法有两种:

  1. 一种是在NotificationCompat.Builder中再连缀一个**setAutoCancel()**方法

image-20230802192621642

  1. 另一种是显式的调用NotificationManager中的**cancel()**方法。

image-20230802193106168

这个1就是我们在创建通知时,为这个通知设置的id

image-20230802193052710

2、通知的进阶用法

android 13都需要在渠道中注册

2.1 设置震动

//注册震动
long[] vibrationPattern = {100, 200, 300, 400}; // 设置震动模式,参数为一个 long 类型数组,表示震动的时长和间隔
// 配置通知出现时的震动(如果 Android 设备支持的话)
notificationChannel.enableVibration(true);
notificationChannel.setVibrationPattern(vibrationPattern);

notificationChannel.setVibrationPattern(vibrationPattern);这段代码也可以不在渠道中设置,只需要使用notificationChannel.enableVibration(true);注册。

然后在通知NotificationCompat.Builder中:

.setVibrate(new long[]{100, 200, 300, 400})

注意设置权限;

<uses-permission android:name="android.permission.VIBRATE"/>

2.2 设置闪烁灯

// 设置通知渠道的闪灯效果
notificationChannel.enableLights(true); // 允许通知闪灯

然后在通知NotificationCompat.Builder中:

.setLights(Color.RED,1000,2000)

第一个参数是颜色,第二个是亮灯时长,第三个是暗灯时长

2.3 设置声音

.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Big_Easy.ogg")))

2.4 创建富文本通知内容

.setStyle(new NotificationCompat.BigTextStyle().bigText("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"))

2.5 显示大图

.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.notify)))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

输入筛选框搜索

文章目录 输入筛选框实现效果图需求前端工具版本添加依赖main.js导入依赖 代码 后端代码对应 sql对应 mapper.xml 文件的动态 sql 输入筛选框实现 效果图 需求 通过筛选框&#xff0c;选择公司&#xff0c;传入后端&#xff0c;后端根据公司名称去文章的内容中进行模糊查询 …

【云原生】K8S二进制搭建上篇

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…

Linux lvs负载均衡

LVS 介绍&#xff1a; Linux Virtual Server&#xff08;LVS&#xff09;是一个基于Linux内核的开源软件项目&#xff0c;用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡&#xff0c;从而提高系统的可扩展性和可…

Redis 集群 (cluster)

是什么 官网&#xff1a;Redis cluster specification | Redis 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作…

【BASH】回顾与知识点梳理(七)

【BASH】回顾与知识点梳理 七 七.前六章知识点总结及练习7.1 总结7.2 练习 七.前六章知识点总结及练习 7.1 总结 由于核心在内存中是受保护的区块&#xff0c;因此我们必须要透过『 Shell 』将我们输入的指令与 Kernel 沟通&#xff0c;好让 Kernel 可以控制硬件来正确无误的…

Open3D (C++) 基于拟合平面的点云地面点提取

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、原始点云2、提取结果四、相关链接本文由CSDN点云侠原创,原文链接。爬虫网站自重,把自己当个人,爬些不完整的误导别人有意思吗???? 一、算法原理

C# Blazor 学习笔记(7):组件嵌套开发

文章目录 前言相关资料组件嵌套组件模板RenderFragment 意义传统前端样式组件化css 前言 我们在组件化一共有三个目的。 不用写CSS不用写html不用写交互逻辑 简单来说就是Java常说的约定大于配置。我们只需要必须的参数即可&#xff0c;其它的都按照默认配置。我们不需要关系…

Java多线程(四)

目录 一、线程的状态 1.1 观察线程的所有状态 1.2 线程状态和状态转移的意义 1.2.1 NEW、RUNNABLE、TERMINATED状态转换 1.2.2 WAITING、BLOCKED、TIMED_WAITING状态转换 1.2.3 yield()大公无私让出cpu 一、线程的状态 1.1 观察线程的所有状态 public class Demo9 {public st…

《向量数据库指南》——腾讯云向量数据库Tencent Cloud Vector DB正式上线公测!提供10亿级向量检索能力

8月1日,腾讯云向量数据库(Tencent Cloud Vector DB)已正式上线公测。在腾讯云官网上搜索“向量数据库”,就可以正式体验该产品。 腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、文本图像检索、自然语言处理等 AI 领域。…

selenium 遇到更新chorme驱动

打开浏览器,在地址栏输入chrome://version/便可以查看到谷歌当前的版本号 谷歌浏览器驱动的下载网址 http://chromedriver.storage.googleapis.com/index.htmlhttp://chromedriver.storage.googleapis.com/index.html 解压后把chromedriver.exe 放到python安装的目录下&am…

【第一阶段】kotlin语言引用数据类型

Java语言中有两种数据类型 第一种&#xff1a;基本数据类型 如int double等 第二种&#xff1a;引用数据类型。如String kotlin只有一种数据类型&#xff0c;看起来都是引用数据类型&#xff0c;实际上编译器会在Java字节码中&#xff0c;修改成基本类型 //Java语言中有两种数…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

Hbase pe 压测 OOM问题解决

说明&#xff1a;本人使用CDH虚拟机搭建了Hbase集群&#xff0c;但是在压测的时发现线程多个的时候直接回OOM,记录一下 执行命令 hbase pe --nomapred --oneContrue --tablerw_test_1 --rows1000 --valueSize100 --compressSNAPPY --presplit10 --autoFlushtrue randomWrite …

BPMNJS插件使用及汉化(Activiti绘制流程图插件)

BPMNJS插件运行最重要的就是需要安装nodejs插件,这不一定要安装和测试好。 主要是使用npm命令 1、配置BPMNJS插件绘制activiti7工作流 1.1、安装和配置nodejs 插件 1.1.1、下载nodejs 下载地址:https://nodejs.org/en 1.1.2、安装nodejs,傻瓜式安装 安装之后在安装…

74HC245芯片的用途

双 P 沟道增强型 MOS 管---D74HC245 目录 双 P 沟道增强型 MOS 管---D74HC245 概述与特点 主要特性 应用领域 管脚定义 管脚定义说明 逻辑框图 直流电气参数 直流特性 交流特性 封装 概述与特点 &#xfffd; 概述 D74HC245 是一种三态输出、八路信号收发器,主要应用…

流控平台Sentinel搭建和接入教程

流量控制和限流是大型系统必不可少的组成部分&#xff0c;Sentinel是Alibaba提供的一款特别好用的专业工具&#xff0c;属于那种看起来很牛&#xff0c;用起来也很牛的工具&#xff0c;下面记录一下接入的过程。 一&#xff0c;搭建平台 1&#xff0c;下载jar包 地址&#x…

分享学习java过程中遇到的一些网址

*****JavaWeb视频教程***** https://www.bilibili.com/video/BV1m84y1w7Tb?p4&spm_id_frompageDriver&vd_source841fee104972680a6cac4dbdbf144b50*****Java前端官网教程&#xff08;HTML、CSS、JS)***** https://www.w3school.com.cn/html/index.asp*****VS Code官网…

2023年智能优化算法---能量谷优化器 Energy valley optimizer(EVO),附MATLAB代码和文献...

简介 能量谷优化器(EVO)是一种新的元启发式算法&#xff0c;它的算法是受到了关于稳定性和不同粒子衰变模式的先进物理原理的启发。在文献中&#xff0c;作者与CEC函数中最先进的算法进行了比较&#xff0c;并且证明该算法确实很强劲。算法原理大家请参考文献。 01 结果展示 在…

分布式软件架构——内容分发网络

内容分发网络&#xff08;CDN&#xff0c;Content Distribution Network或Content Delivery Network&#xff09; 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现…

修改el-select或者el-input样式失效

下午改el-input和el-select这两个的样式真的烦&#xff0c;&#xff0c;&#xff0c;还不如写原生标签了。。 样式使用的是sass 我已经在样式器中挨着挨着去找了&#xff0c;把层级的类都写下来了 .select-wraper{//下拉框.el-select{.el-input .el-input__wrapper{backgrou…