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

news2024/12/28 5:15:24

一、使用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)))

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

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

相关文章

Mr. Cappuccino的第57杯咖啡——简单手写Mybatis大致原理

简单手写Mybatis大致原理 大致原理项目结构项目代码代码测试 大致原理 底层基于JDK动态代理技术实现 项目结构 项目代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

在 TDosCommand 组件中执行多个命令

在 TDosCommand 组件中执行多个命令可以通过在命令行中使用“&&”或“&”符号来实现。其中&#xff0c;“&&”符号表示前一个命令执行成功后才会执行下一个命令&#xff0c;“&”符号表示前一个命令执行完成后立即执行下一个命令。下面是一个示例程序&…

首页和图表的定制

首页就是刚刚那些在静态资源扫描文件下叫 index.html 的文件 头像

Netty+springboot开发即时通讯系统笔记(一)

业务部分从sql开始&#xff1a; /*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50740Source Host : localhost:3306Source Schema : im-coreTarget Server Type : MySQLTarge…

代码随想录算法训练营之JAVA|第十八天| 235. 二叉搜索树的最近公共祖先

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 235. 二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/descriptio…

P9-CNN学习1.1-VggNet

目录 一.Abstract 二.Introduction 三.ConvNet Configuration 3.1Architecture 3.2Configuration 3.3Discussion 四.Classification Framework 4.1Training 4.2Testing 4.3Implementation Detail 五.Classification Experiments 5.1Single Scale Evaluation 5.2Mul…

【Java】Spring Boot的创建和使用,以及配置文件(.properties和.yml)和日志文件(LoggerFactory和lombok)

什么是Spring BootSpring Boot的优点创建Spring Boot项目Spring Boot的配置文件配置文件的作用配置文件的格式properties 配置文件说明properties的基本语法读取配置文件properties的缺点 yml 配置文件说明基本语法yml 连接数据库读取配置文件yml进阶yml 配置不同数据类型及 nu…

IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)

1.守护进程&#xff08;幽灵进程&#xff09; #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpid fork();if(0cpid){ //创建新的会话pid_t sidsetsid();printf("sid%d\n",sid);//修改运行目录为不可卸载的文件…

蓝牙资讯|三星Galaxy SmartTag 2亮相FCC,智能防丢市场持续火爆

三星的 Galaxy SmartTag 2 已经现身美国联邦通信委员会&#xff08;FCC&#xff09;网站&#xff0c;外观设计也随之曝光&#xff0c;该设备呈扁平的椭圆形&#xff0c;顶部有一个巨大的钥匙环孔&#xff0c;看起来有点像雪茄切割器。如果这是一个普通的钥匙环大小的孔&#xf…

UG\NX 二次开发 选择相切面、相邻面的选择面控件

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗&#xff1f;” 这个用Block UI的"面收集器"就可以&#xff0c;ufun函数是不行的。 效果&am…

基于text2vec和faiss开发实现文档查询系统初体验

最近接触到了一些文本向量化的预训练模型&#xff0c;感觉相比较自己去基于gensim去训练词向量来说&#xff0c;使用预训练模型可能是更高效的方式了&#xff0c;正好有一个想法一直在想能够以什么样的形式间接的实现问答&#xff0c;说白了这里的问答跟我们理解的chatGPT类型的…

iOS——Block one

块类似于匿名函数或闭包&#xff0c;在许多其他编程语言中也存在类似的概念。 可以访问上下文&#xff0c;运行效率高 Block 以下是块的一些基本知识&#xff1a; 块的定义&#xff1a;块是由一对花括号 {} 包围的代码片段&#xff0c;可以包含一段可执行的代码。块的定义使…

125.验证回文串

目录 一、题目 二、代码 一、题目 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public: bool ABC(char& s) {if (s > 65 && s < 90){s 32;return true;}if (s > 97 && s < 122){return true;}if …

FPGA开发:音乐播放器

FPGA开发板上的蜂鸣器可以用来播放音乐&#xff0c;只需要控制蜂鸣器信号的方波频率、占空比和持续时间即可。 1、简谱原理 简谱上的4/4表示该简谱以4分音符为一拍&#xff0c;每小节4拍&#xff0c;简谱上应该也会标注每分钟多少拍。音符时值对照表如下图所示&#xff0c;这表…

无涯教程-Lua - while语句函数

只要给定条件为真&#xff0c;Lua编程语言中的 while 循环语句就会重复执行目标语句。 while loop - 语法 Lua编程语言中 while 循环的语法如下- while(condition) dostatement(s) end while loop - 流程图 在这里&#xff0c;需要注意的关键是 while 循环可能根本不执行。…

Go语音介绍

Go语言介绍 Go 即Golang&#xff0c;是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言&#xff0c;是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码&#xff0c;然后由解析器对代码进行解释执行。 编译型语言——源代码编…

【树形DP+换根思想】2022牛客多校加赛 H

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这个虽然是树形DP&#xff0c;却用了换根的思想.... 首先&#xff0c;后缀0的个数可以转化成min(cnt2,cnt5)&#xff0c;其中cnt2为2的因子个数&#xff0c;cnt5为5的因子个数 然后进行DP 设dp[u]…

面试之多线程(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

基于Vue+ElementUI+Echarts+G2Plot的仪表盘设计器,代码完全开源

简介 &#x1f525;DashBoard基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘设计、预览、资源管理、组件管理等能力&#xff0c;支持JSON、MySQL、Oracle、PostgreSQL、HTTP、JavaScript、Groovy等数据集接入&#xf…

类加载器的双亲委派机制和源码分析

双亲委派机制 双亲委派就是一个从子到父的过程,然后还有一个从父到子的状态。具体如下: 如果一个类加载器收到了类加载的请求,它会首先去自己的缓存中查找是否加载过这个类(findLoadedClass),如果有,那么直接加载。如果没有就会让父加载器加载,父加载器会先去自己的缓…