Electron自定义通知Notification

Notification是什么?

对于渲染进程,Electron 允许开发者使用通知中API,来运行系统的原生通知进行显示。

如何实现系统Notification?

const { Notification } = require('electron');

const isAllowed = Notification.isSupported();
if (isAllowed) {
    const options = {
        title: '标题',
        body: '正文文本,显示在标题下方',
        silent: true, // 系统默认的通知声音
        icon: '', // 通知图标
    }
    const notification = new Notification(argConig);
    notification.on('click', () => {  });
    notification.on('show', () => {  });
    notification.on('close', () => {  });
    notification.show();
}

系统Notification的困扰

1)受限于当前系统是否支持系统通知,在mac或windows电脑的设置中,需特别注意是否允许通知。

2)样式单一,只能是系统自带的样式,对于不同业务场景无法满足;

3)mac与window各自对于一些功能不支持。比如:

timeoutType(通知的超时持续时间),只有window与linux支持。

closeButtonText(自定义关闭按钮提示内容),只有mac支持。

那么怎么实现我们既定的需求呢?

我在网上也查了很多资料,但并没有得到很理想的结果,所以只能借助于Electron提供的能力来尝试实现 自定义通知

自定义通知

优势在于不受限于系统,样式可以按照自己的想法设计。

实现通知

通知窗体实现

通过使用BrowserWindow()窗口来实现,设置好需要的自定义通知的尺寸与位置。

const { BrowserWindow, screen } = require('electron')
const win = new BrowserWindow({ 
    width: 800, 
    height: 600,
    show: false,
    y: 0,
    x: 0,
    frame: false, // 无边框
    skipTaskbar: true, // 使窗口不显示在任务栏中
    movable: false,  // 禁止窗口被用户移动
    resizable: false, // 禁止窗口手动调整窗口大小
    fullscreenable: false, // 禁止窗口可以进入全屏状态
    alwaysOnTop: true, // 窗口是否永远在别的窗口的上面
})
win.loadFile('./html/customNotification.html')
// 定位到桌面右上角
const sizeObj = screen.getPrimaryDisplay().workAreaSize;
const { width, height } = sizeObj;
const [cwidth, cheight] = win.getContentSize();
const left = parseInt(width - (cwidth || 0) - 5);
const top = 10;
win.setPosition(left, top);

win.showInactive(); // 显示但不聚焦于窗口(建议做延时处理)

这种方式的实现相当于是类通知

因为类通知的实现是通过Electron创建窗口实现的。故需要关闭窗口的一些默认特性,也需要开启某些特性(详见上侧代码)。

通知UI样式

win.loadFile(‘./html/customNotification.html’)

loadFile可以将React或者Vue等开发编译后的代码加载展现出来。

管理通知

业务场景:

桌面应用接收发送的通知消息,在电脑桌面右上角进行展示;

接收到第一条通知消息,显示UI设计的通知;

关闭当前通知才可以展示下一条通知消息。

分析:

通知不可能只有一条消息,可能会是多条,也有可能会是同时多条(并发)。

如何管理以上这种情况呢?

image.png

我做了两个概念(有序消息池消息队列)的思路,供大家参考(也可用于其他业务下的并发处理,已实践)。

这里主要是重思路,就不写代码了…

有序消息池

用于存储消息数据。

由于数据不同,有时需要对数据进行处理,这个过程是耗时的,而这期间如果多条或者并发的数据出现,容易导致数据出现混乱、无序。

同时如果出现重复、整合的数据,就没必要再执行一次了。

1、重复:多条数据以最后一条为准,其他舍弃。

2、整合:多条数据同属于同一个数据,该数据需要将其他的数据整合起来。

或者有些情况下是可以直接异步展示所有数据的。

消息队列

用于推送消息。

队列里面有消息就推送,不需要推送,就静默。

可以同时异步推送多条消息,也可以只推一条。

思路

1、消息整合

对于接收到的数据不做任何处理。

生成消息的唯一Key(服务端不生成的情况下),push进有序消息池

2、有序消息池

对于数据复杂、数据量大的情况下,做有序消息池映射处理(建议使用Map)。

3、switch

开关,是否执行生成消息队列 && 是否有序数据池有数据。

false,否,停止流程。

true,是,进入生成消息队列操作

4、生成消息队列

关闭switch开关。

读取有序消息池数据。

遵循业务规则对数据做重复、整合处理。

将唯一Key按序添加到消息队列中。

5、消息队列

判断通知是否存在,如果已存在,再次进入2有序数据池节点执行。

反之通知未存在,创建通知,进入有序数据池节点执行。

6、关闭通知

关闭通知后,再次进入5消息队列节点执行。

扩展

这同时也是可以解决多条、并发情况下的思路。

从逻辑图中的 5、消息队列 往后,是为了通知业务需求而做的。

如果有的业务允许多条消息同时更新,那么5、消息队列这里可以执行异步更新,就没必要按照通知这种同步执行了。

思路有不完美的地方,欢迎大家积极指正沟通,共同学习,共同进步~~

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

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

相关文章

最新ChatGPT商业运营网站程序源码,支持Midjourney绘画,GPT语音对话+DALL-E3文生图+文档对话总结

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年,买过好多书,也看过好多书,分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

【【IIC模块Verilog实现---用IIC协议从FPGA端读取E2PROM】】

IIC模块Verilog实现–用IIC协议从FPGA端读取E2PROM 下面是 design 设计 I2C_dri.v module IIC_CONTROL #(parameter SLAVE_ADDR 7b1010000 , // E2PROM 从机地址parameter CLK_FREQ 26d50_000_000 , // 50MHz 的时钟频率parameter …

[内功修炼]函数栈帧的创建与销毁

文章目录 1:什么是函数栈帧2:理解函数栈帧能解决什么问题呢3:函数栈帧的创建与销毁的解析3.1:什么是栈3.2:认识相关寄存器与汇编指令相关寄存器相关汇编指令 3.3 解析函数栈帧的创建和销毁3.3.1 预备知识3.3.2 详细解析一:调用main函数,为main函数开辟函数栈帧First:push前push…

【Python3】\u字符与中文字串互转

小水。 encode和decode: str没有decode函数,但对应的有encode函数,该函数作用是转码为bytes对象bytes通过decode函数转换回对应的str对于一些偏激的(可以用过分来形容)的字符串,例如一二三\\u56db\\u4e94\\u516d,是有…

k8s 组件

k8s: kubernets:8个字母省略,就是k8s. 自动部署,自动扩展和管理容器化的应用程序的一个开源系统。 k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。 以分布式和集群化的方式进行容器管理。 1.20面试版本 …

RPC(6):RMI实现RPC

1RMI简介 RMI(Remote Method Invocation) 远程方法调用。 RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。 RMI 是Java语言的远程调用,无法实现跨语言。…

小程序真机如何清除订阅数据

在做小程序订阅消息开发的过程中发现,真机上如果是选择了‘总是保持以上选择’,一旦用户授权后,后面就不会再弹出申请改订阅消息的授权弹窗,这对于开发过程中是很不方便的。 曾试过清除缓存,重进小程序也不能清除掉 解…

爬虫反爬之代码混淆,特殊编码,表情编码

不知道你是否见过这样的代码,完全看不懂。 大家好,这一集我们来看一下前端反爬的代码混淆,一般啊我们自己写的前端代码都是直接上传公开的,如果用的不是框架打包出来的代码,就是自己写的js,html文件没有经过…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1:查看->命令面板 方法2:按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

SPFA算法总结

知识概览 SPFA算法是Bellman_Ford算法的优化。时间复杂度一般是O(m),最坏时间复杂度是O(nm)(遇到网格图、菊花图),其中n是点数,m是边数。SPFA算法其实是单源最短路限制最小的算法,只要图中没有负环&#xf…

Mongodb基础介绍与应用场景

NoSql 解决方案第二种 Mongodb MongoDB 是一款开源 高性能 无模式的文档型数据库 当然 它是NoSql数据库中的一种 是最像关系型数据库的 非关系型数据库 首先 最需要注意的是 无模式的文档型数据库 这个需要后面我们看到它的数据才能明白 其次是 最像关系型数据库的非关系型数据…

通过three.js玩转车展项目

1.项目搭建 1.1 创建文件夹 mkdir 文件名1.2 初始化package.json npm init -y1.3 安装打包工具并配置相关依赖 npm i parcel -d在package.json中打包路径和指令 1.4 安装three.js npm i three -d2.项目搭建 2.1 新建index.html,并再index.html引入car.js,在…

2023版本QT学习记录 -6- UDP通信之UDP接收端

———————UDP接收端——————— 🎄动图演示 🎄发送端通信步骤思维导图 🎄添加组件 QT core gui network🎄添加头文件 #include "qudpsocket.h"🎄创建接收对象 QUdpSocket *recvsocket;&…

在VSCode中使用Git教程

文章目录 提交代码操作分支提交远程库拉取代码参考 介绍一下如何在VSCode中使用Git 首先在VSCode中打开一个项目 打开项目后, 点击下图按钮, 可以引入Git 提交代码 点击 ;相当于git add. 下面两张图, 第一张表示改文件后的号, 只会add本文件. 第二张图表示这段时…

Jenkins的邮箱配置和插件下载

启动:java -jar jenkins.war 一定在jenkins.war的目录下 进入cmd命令 浏览器输入网址:http://localhost:8080/login?from%2F 账号:admin 密码:123456 安装插件: 插件更新后重启下 配置邮箱账号: 3…

关于PSINS中涉及到的地球参数更新

地球参数相关的更新函数 void CEarth::Update(const CVect3 &pos, const CVect3 &vn, int isMemsgrade) 用到位置以及速度 那么位置和速度用的哪个时刻的? 假如设计算周期为[T,2T] ; 解算时刻为2T时刻,那么地球参数用的是哪一时刻的…

【自然语言处理】用Python从文本中删除个人信息-第二部分

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

canvas基础教学

Canvas <canvas>是一个可以使用脚本&#xff08;通常是JavaScript&#xff09;来绘制图形的HTML元素&#xff0c;例如&#xff0c;它可以用于绘制图表、制作图片构图或者制作简单的动画。 本篇博客从一些就基础开始&#xff0c;描述了如何使用<canvas>元素来绘制…

Java基础回顾——多线程

文章目录 介绍创建新线程线程的状态中断线程守护线程线程同步同步方法 死锁wait和notifyReentrantLockconditionReadWriteLockStampedLockSemaphore线程池FutureCompletableFuture 介绍 计算机中&#xff0c;一个任务称为一个进程&#xff0c;某些进程内部还需要同时执行多个子…