Android消息通知Notification

Notification

    • 发送消息
    • 接收消息

#前言

最近在做消息通知类Notification的相关业务,利用闲暇时间总结一下。主要分为两部分来记录:发送消息和接收消息。

发送消息

发送消息利用NotificationManager类的notify方法来实现,现用最普通的方式发送:

Notification.Builder builder = new Notification.Builder(context, channelId);
builder.setSmallIcon(R.drawable.ic_launcher).setContentTitle("标题").setContentText("内容")
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel = new NotificationChannel(channelId, name,NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification);                      

这样一段简单的发送消息的代码就完成了。
在发送消息的时候builder可以携带很多参数,具体查看api即可,这里我记录一下我用到的一些常用的方法。

builder..addAction(icon,title,pendingIntent);

三个参数分别是int类型(api已过时),charText类型和pendingIntent意图。
这个方法我认为就很不错,比如当需要封装一个公共的弹窗,但是按钮数量和按钮颜色以及弹窗的标题不一样,这时候就可以利用这个方法进行规定。因为action是个数组,需要几个传几个就可以,比如弹窗有两个按钮,那么就传两个action过去,第一个参数传按钮的颜色值,第二个参数传按钮的名称,第三个参数传pendingIntent意图。这样就不用很复杂的实现逻辑就可以完成这个公共的弹窗。
同样,builder支持传bundle,方法如下:

Bundle bundle = new Bundle();
builder.setExtras(bundle);

bundle可以携带参数,同理刚才说的封装公共弹窗也可以用bundle传值的形式实现,但是相比较action的方式是不是就会复杂很多。
bundle可以传递一些公共的参数,比如一个type,当接收到通知的时候利用type来区分要做什么动作,这个就看项目实际需求了。
这里我把通知跳转意图的跳转activity和接收广播的代码放上来,也为自己做个记录。

Bundle bundle = new Bundle();
NotificationChannel notificationChannel = new NotificationChannel("99", "TEMP", NotificationManager.IMPORTANCE_DEFAULT);                 
Notification.Builder builder = new Notification.Builder(MainActivity.this, "99");
//Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Intent intent = new Intent(MainActivity.this,MyBroadCastReceiver.class);
intent.setAction("android.intent.action.MY_BROADCAST");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
builder.setSmallIcon(R.drawable.ic_launcher_background).setContentTitle("标题").setContentText("内容").setWhen(System.currentTimeMillis()).addAction(R.color.purple_200,"确定",pendingIntent).addAction(R.color.black,"取消",pendingIntent).setExtras(bundle);
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification);

删除通知:

manager.cancel(tag,id);

这里注意的是发送通知可以是两个参数和三个参数,三个参数的方法第一个参数是tag,那么调用删除方法的时候要和这个tag对应上,就是要删除哪条消息就传哪个tag。

接收消息

接收消息我是重新创建一个类继承自NotificationListenerService,然后复写需要用到的几个方法,由于我的项目是systemui的开发,所以和实际需求上可能会略有不同。

@Overridepublic void onNotificationPosted(StatusBarNotification sbn)

该方法是接收到消息通知时的回调。
我不太清楚为什么我只发送了一次通知,但在该方法中却收到了两次消息。那就想办法过滤一下吧。利用sbn返回的key和time来判断。

mPreviousNotificationKey = sbn.getKey();
mPreviousNotificationKeyTime = sbn.getPostTime();

正常创建两个变量来保存该次受到的key和postTime。然后利用sp先来获取一次上次保存的这两个值,再把该次获取的这两个值利用sp存上。

 String mPreviousNotification = spHelper.getString("notificationKey");Long mPreviousNotificationTime = spHelper.getLong("notificationTime");spHelper.putValues(new SPHelper.ContentValue("notificationKey", mPreviousNotificationKey));spHelper.putValues(new SPHelper.ContentValue("notificationTime", mPreviousNotificationKeyTime));

然后根据两次取值判断:

if (mPreviousNotificationKey.equals(mPreviousNotification) && mPreviousNotificationKeyTime.equals(mPreviousNotificationTime)) {return;
}

两次值一样直接return过滤掉。

 @Overridepublic void onNotificationRemoved(StatusBarNotification sbn)

该方法是接收到删除消息的通知。
至此,结束,方便过后有类似需求查阅。

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

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

相关文章

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本,jdk8和jdk17 自从升级IDEA版本到2023以后,每次打开新项目,sdk都被默认选择成了jdk17, 每次都得手动修改 (File--Project Structure),超级麻烦。 没有用的解决方法 以下这…

C++模板:函数模板

基本语法&#xff1a; template <typename T> void mySwap(T& a, T& b) {//类型参数化T temp a;a b;b temp; } void test01() {int a 10, b 20;//自动类型推导mySwap(a,b);//显示指定类型mySwap<int>(a, b); } 实例&#xff1a;数组排序 template&…

2. 路由 Vue-Router

目录 2.1 Vue-Router 介绍 2.2 路由配置 2.3 嵌套路由 Vue1&#xff1a;基础跟使用方式 2.1 Vue-Router 介绍 vue 属于单页面应用&#xff0c;所谓路由&#xff0c;就是根据浏览器路径不同&#xff0c;用不同的视图组件替换这个页面内容。 在vue应用中使用路由功能&#x…

Unity 渲染管线自动转换的实现 支持HDRP转URP,URP转HDRP

HDRP和URP无法平滑切换&#xff0c;因为属性、功能差异巨大。 本脚本仅对可对应的默认脚本和属性做了转换处理。细节调整还需自己搞。 自动转换可以节省手动更换shader、texture、通用属性的劳动成本。 操作步骤 使用前确保当前项目中存在HDRP和URP的包&#xff0c;没有请到p…

【GPU驱动开发】- GPU架构流程

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; 一、总述 GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 总体流…

UE4 C++ 枚举类型

先在UCLASS()前写入&#xff1a; //定义枚举变量&#xff1a;方法一 UENUM(BlueprintType) //BlueprintType&#xff1a;在蓝图中可显示、创建该枚举变量 namespace MyEnumType //namespace&#xff1a;命名空间&#xff0c;支持同样的变量命令、便于访问//MyEnumType&#xf…

仪器接口设计

不是所有设备都是TCP连接模式&#xff0c;有读文件的、读数据库的设备&#xff0c;为此还需要一个客户端仪器接口程序&#xff0c;面向接口编程是一个良好的思想&#xff0c;他使得调用者和接口实现者不用绑定太死&#xff0c;只要双方按约定实现即可。 仪器有读文件的、写文件…

Maven配置笔记

1、下载Maven 在Maven的官网即可下载&#xff0c;点击访问Apache Maven。 2、配置环境变量 chcp 65001 echo off set mvnhomeE:\apache-maven-3.8.4 rem LPY echo. echo ************************************************************ echo * …

线程池,定时器以及阻塞队列(生产者/消费者模型)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;线程池,定时器以及阻塞队列(生产者/消费者模型) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 实现线程池,定时器以及阻塞队列,生产者/消费者模型 线程池线程池…

Redis核心技术与实战【学习笔记】 - 11.响应延迟的波动问题及解决方案

在 Redis 的实际应用中&#xff0c;有一个非常严重的问题&#xff0c;就是 Redis 突然变慢了。举个例子&#xff0c;在秒杀场景下&#xff0c;一旦 Redis 变慢了&#xff0c;大量的用户下单请求就会被拖慢&#xff0c;也就是说&#xff0c;用户提交了下单申请&#xff0c;确没有…

【JavaEE进阶】 图书管理系统开发日记——肆

文章目录 &#x1f343;前言&#x1f38d;约定前后端交互接⼝&#x1f340;服务器代码实现&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f334;前端代码的修改⭕总结 &#x1f343;前言 今天我们来实现修改图书模块 首先我们先来看一下&#xff0c;需要…

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…

[AIGC] 21世纪Java与Go的相爱相杀

在21世纪的软件开发领域中&#xff0c;Java和Go这两门编程语言可谓是相爱相杀的存在。它们各自拥有着强大的特点和独特的优势&#xff0c;同时也存在着一些明显的竞争和冲突。让我们来看看这两门语言的故事&#xff0c;以及它们之间的深远意义。 文章目录 Java的魅力Go的魅力相…

C++写算法题时常见问题(稳定更新)

目录 1.如何用 getline 函数读取用户输入的一行 2.如何防止用 scanf 读取字符时读取了 换行和空格 3.map和unordered_map的差别和使用 4.“表达式求值”问题解析 5.运行报RE错误 6.在set或者map里面使用结构体 7.运行时报TLE时&#xff0c;时间复杂度问题 8.double类型的…

Photoshop CS6 下载安装教程,保姆级教程,小白也能轻松搞的,附安装包

前言 Adobe Photoshop CS6强大的照片拍摄和突破性的新功能&#xff0c;用于复杂的图形、选择、逼真的绘画和装饰智能。创建惊人的高动态范围(HDR)图像。用逼真的笔触和混合的颜色绘画。消除噪音&#xff0c;添加种子&#xff0c;并绘制一个国家最先进的摄影设备的草图。凭借原…

神经网络不需要懂原理,只需要应用???(附268篇顶会论文)

神经网络不需要弄明白原理&#xff0c;只要会应用就行&#xff0c;这是真的吗&#xff1f; 具体情况具体分析。如果你是论文要求不高&#xff0c;那么就不需要搞太清楚&#xff0c;如果你的毕业要求高&#xff0c;或者想要更高的提升&#xff0c;尤其是想申博、进大厂&#xf…

golang网络编程day6(结)

golang网络编程day6 golang websocket编程golang rpc编程最终总结 golang websocket编程 什么是websocket&#xff1f;&#xff0c;和socket是一回事吗&#xff1f; websocket和传统的socket有些相似&#xff0c;又有些重要区别 1.WebSocket&#xff1a; &#xff08;1&#…

【C语言】socket编程接收问题

一、recv()函数接收到的返回值为0表示对端已经关闭 在TCP套接字编程中&#xff0c;通过recv()函数接收到的返回值为0通常表示对端已经关闭了套接字的发送部分。这是因为TCP是一个基于连接的协议&#xff0c;其中有定义明确的连接建立和终止流程&#xff1b;当对端调用close()或…

Vue2.0 组件传值方式:父传子、子传父、非父子组件传值

文章目录 1. 父组件向子组件进行传值父组件&#xff1a;子组件&#xff1a; 2. 子组件向父组件传值子组件&#xff1a;父组件&#xff1a; 3. 非父子组件进行传值公共bus.js组件A&#xff1a;组件B&#xff1a; 每次总结都是在加强一遍记忆 1. 父组件向子组件进行传值 父组件&…