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

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

鸿蒙next学习交流q群:767465523

目录

 1. 用户通知服务基本介绍

2. 能力范围

3. 业务流程

4. 用户通知服务-工具类封装小案例

4.1 基本介绍

4.2 操作环境

4.3 代码实现

4.3.1 文本通知工具类

4.3.2 文件通知工具类

4.3.3 页面的编写

5. 学习地址


 1. 用户通知服务基本介绍

Notification Kit(用户通知服务)为开发者提供本地通知发布通道,开发者可借助Notification Kit将应用产生的通知直接在客户端本地推送给用户,本地通知根据通知类型及发布场景会产生对应的铃声、震动、横幅、锁屏、息屏、通知栏提醒和显示。

2. 能力范围

Notification Kit支持的能力主要包括:

  • 发布文本、进度条等类型通知。
  • 携带或更新应用通知数字角标。
  • 取消曾经发布的某条或全部通知。
  • 查询已发布的通知列表。
  • 查询应用自身通知开关状态。
  • 应用通知用户的能力默认关闭,开发者可拉起授权框,请求用户授权发布通知。

3. 业务流程

使用Notification Kit的主要业务流程如下:

1.请求通知授权。

2.应用发布通知到通知服务。

3.将通知展示到通知中心。

Notification Kit中常用的通知样式如下:

注意:

  • 单个应用已发布的通知在通知中心等系统入口的留存数量有限(当前规格最多24条)。
  • 通知的长度不能超过200KB(跨进程序列化大小限制)。
  • 系统所有应用发布新通知的频次累计不能超过每秒10条,更新通知的频次累计不能超过每秒20条。

官方文档地址:文档中心

4. 用户通知服务-工具类封装小案例

4.1 基本介绍

通过案例我们能学习到:用户通知服务还有部分文件服务基础能力工具类的封装,教大家如何进行工具类封装。

主体功能:用户点击下载文件按钮,触发通知,也可以取消通知

4.2 操作环境

记得在module.json文件中配置网络权限

    "requestPermissions":[{"name" : "ohos.permission.INTERNET","reason": "$string:internet","usedScene": {"abilities": ["FormAbility"],"when":"inuse"}}],

4.3 代码实现

界面如下:

4.3.1 文本通知工具类

NotificationUtil.ets

import { notificationManager } from '@kit.NotificationKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';export class NotificationUtil {/*** 查询通知是否授权*/static async isNotificationEnabled(): Promise<boolean> {return await notificationManager.isNotificationEnabled(); //查询通知是否授权。}/*** 请求通知授权,第一次调用会弹窗让用户选择。* @returns*/static async authorizeNotification(): Promise<boolean> {let isEnabled = await NotificationUtil.isNotificationEnabled(); //查询通知是否授权if (!isEnabled) { //未授权,拉起授权try {let context = getContext() as common.UIAbilityContext;await notificationManager.requestEnableNotification(context);return true;} catch (e) {return false;}} else {return true;}}/*** 发起普通文本通知*/static publishText(notificationOptions: NotificationOptions): Promise<boolean> {return new Promise<boolean>((resolve, reject) => {let notificationRequest: notificationManager.NotificationRequest = {// 通知的唯一idid: notificationOptions.id,content: {notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知normal: {// 通知的标题title: notificationOptions.title,// 通知的内容text: notificationOptions.text,// 附加消息additionalText: notificationOptions.additionalText,}}};notificationManager.publish(notificationRequest, (err: BusinessError) => {if (err) {console.log(`Failed to publish notification. Code is ${err.code}, message is ${err.message}`)reject(err)}console.log('Succeeded in publishing notification.')resolve(true)});})}/*** 取消通知*/static cancel(id: number): Promise<boolean> {return new Promise<boolean>((resolve, reject) => {notificationManager.cancel(id, (err: BusinessError) => {if (err) {console.log(`Failed to cancel notification. Code is ${err.code}, message is ${err.message}`)reject(err)}console.log('Succeeded in cancel notification.')resolve(true)});})}/*** 取消所有通知*/static cancelAll(): Promise<boolean> {return new Promise<boolean>((resolve, reject) => {notificationManager.cancelAll((err: BusinessError) => {if (err) {console.log(`Failed to cancel notification. Code is ${err.code}, message is ${err.message}`)reject(err)}console.log('Succeeded in cancel notification.')resolve(true)});})}
}interface NotificationOptions {id: numbertitle: stringtext: stringadditionalText: string}

4.3.2 文件通知工具类

FileUtil.ets

import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import { BusinessError } from '@ohos.base';let context = getContext(this) as common.UIAbilityContext;export class FileUtil {/*** 判断文件是否存在*/static isExist(fileName: string, fileSuffix: string) {// 判断文件是否存在,存在就删除let path = context.filesDir + '/' + fileName + '.' + fileSuffix;if (fs.accessSync(path)) {fs.unlinkSync(path);}}/*** 下载文件*/static downloadFile(fileName: string, fileSuffix: string, fileUrl: string): Promise<boolean> {return new Promise<boolean>((resolve, reject) => {// 判断文件是否已存在FileUtil.isExist(fileName, fileSuffix)request.downloadFile(context, {url: fileUrl,filePath: context.filesDir + '/' + fileName + '.' + fileSuffix}).then((downloadTask: request.DownloadTask) => {downloadTask.on('complete', () => {resolve(true)})}).catch((err: BusinessError) => {console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);reject(err)});})}
}

4.3.3 页面的编写

Index.ets

import { NotificationUtil } from '../utils/NotificationUtil'
import { promptAction } from '@kit.ArkUI'
import { BusinessError } from '@kit.BasicServicesKit'
import { FileUtil } from '../utils/FileUtil'@Entry@Componentstruct Index {build() {Column({ space: 20 }) {Button('发起通知').onClick(async () => {// 发起通知授权let isSuccess = await NotificationUtil.authorizeNotification()if (isSuccess) {// 发起通知NotificationUtil.publishText({id: 1,title: '百得知识库',text: '百得知识库提醒你该学习了',additionalText: '百得'}).then(() => {promptAction.showToast({ message: '发起通知成功' })}).catch((error: BusinessError) => {promptAction.showToast({ message: '发起通知失败' + error.message })})} else {promptAction.showToast({ message: '通知授权失败' })}}).margin(100)Button('取消通知').onClick(async () => {let flag = await NotificationUtil.cancel(1)if (flag) {promptAction.showToast({ message: '取消通知成功' })return}promptAction.showToast({ message: '取消通知失败' })})Button('取消所有通知').onClick(async () => {let flag = await NotificationUtil.cancelAll()if (flag) {promptAction.showToast({ message: '取消所有通知成功' })return}promptAction.showToast({ message: '取消所有通知失败' })}).margin(100)Button('下载文件完成通知').onClick(() => {FileUtil.downloadFile('hello', 'txt', 'http://121.41.123.231:8888/f/e01ace4294264594b632/?dl=1').then(async (data) => {promptAction.showToast({ message: '文件下载成功' })// 发起通知授权let isSuccess = await NotificationUtil.authorizeNotification()if (isSuccess) {// 发起通知NotificationUtil.publishText({id: 2,title: '百得知识库',text: '文件下载成功',additionalText: '百得'}).then((data) => {if (data) {promptAction.showToast({ message: '发起通知成功' })return}promptAction.showToast({ message: '发起通知失败' })}).catch((error: BusinessError) => {promptAction.showToast({ message: '发起通知失败' + error.message })})} else {promptAction.showToast({ message: '通知授权失败' })}}).catch((error: BusinessError) => {promptAction.showToast({ message: '文件下载失败' + error.message })})})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}}

5. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开发!视频陆续更新中!_哔哩哔哩_bilibili

相关文章:

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

RHCE——系统的延迟任务及定时任务

延迟任务的发起 在系统中我们可以使用 at 命令来发起延迟任务 at 命令执行是调用的是 atd 服务&#xff0c;即使系统最小化安装 atd 也会被安装到系统中 at 任务信息存放在系统中 /var/spool/at 目录中 at 任务的日志文件被存放到 /var/log/cron 中 at 任务执行时如果遇…...

ForEach刷新UI机制

官网地址&#xff1a;ForEach 在ArkUI中&#xff0c;提供了ForEach循环语句&#xff0c;用来初始化一个列表数据&#xff0c;我们知道&#xff0c;当ForEach中的数组发生变化时&#xff0c;会引起UI的刷新&#xff0c;但是究竟如何变化&#xff0c;会引起UI怎样的刷新&#xf…...

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集&#xff0c;分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率&#xff0c;用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率&#xff0c;那么对于一个新数据点(x,y)…...

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…...

二级等保要求及设备有哪些?

《网络安全法》规定我国信息系统实际等级保护制度&#xff0c;不同等保等级要求不同&#xff1a; 二级等保&#xff08;指导保护级&#xff09;&#xff1a;等级保护对象受到破坏后&#xff0c;会对公民、法人和其他组织的合法权益产生严重损害&#xff0c;或者对社会秩序和公…...

无人机的动力系统节能——CKESC电调小课堂12

1.优化电机和螺旋桨配置 精准匹配&#xff1a;根据无人机的设计用途和负载要求&#xff0c;精确选择电机和螺旋桨。确保电机的功率、扭矩等参数与螺旋桨的尺寸、螺距等完美匹配。例如&#xff0c;对于轻型航拍无人机&#xff0c;选用功率合适的小尺寸电机搭配高效的小螺旋桨&a…...

人机打怪小游戏(非常人机)

按q攻击 按箭头进行控制 玩家是 怪是* 攻击是^ ​ ​ #include<bits/stdc.h> #include<Windows.h> #include<conio.h> #define fr(i,a,b) for(int ia;i<b;i) #define rd(a,b) rand()%(b-a1)a using namespace std; int x16,y21,dx[4]{-1,0,1,0},dy[4]{0,…...

SpringBoot 集成 Sharding-JDBC(一):数据分片

在深入探讨 Sharding-JDBC 之前&#xff0c;建议读者先了解数据库分库分表的基本概念和应用场景。如果您还没有阅读过相关的内容&#xff0c;可以先阅读我们之前的文章&#xff1a; 关系型数据库海量数据存储策略-CSDN博客 这篇文章将帮助您更好地理解分库分表的基本原理和实现…...

django-ninja 实现cors跨域请求

要在Django-Ninja项目中实现跨域&#xff08;CORS&#xff09;&#xff0c;你可以使用django-cors-headers库&#xff0c;这是一个专门用于处理跨域资源共享&#xff08;CORS&#xff09;问题的Django应用程序。以下是具体的步骤和配置&#xff1a; 安装依赖&#xff1a; 使用p…...

【论文阅读】InstructPix2Pix: Learning to Follow Image Editing Instructions

摘要&#xff1a; 提出了一种方法&#xff0c;用于教导生成模型根据人类编写的指令进行图像编辑&#xff1a;给定一张输入图像和一条书面指令&#xff0c;模型按照指令对图像进行编辑。 由于为此任务获取大规模训练数据非常困难&#xff0c;我们提出了一种生成配对数据集的方…...

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC&#xff08;精简指令集&#xff09;MCU的SOC芯片&#xff0c;用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统&#xff1f; 无钥匙进入系统具有无钥匙进入并且启动的功能&#xff0c;英文名称是PKE&…...

【第四课】rust声明式宏理解与实战

目录 前言 理解宏 实战宏 前言 上一课在介绍vector时&#xff0c;我们再一次提到了rust中的宏&#xff0c;在初始化vector时使用了vec!宏&#xff0c;当时补了一句有机会会好好说明一下rust中的宏&#xff0c;并且写一个hashmap宏来初始化hashmap。想了想一直介绍基本语法还…...

渗透测试--Linux下的文件传输方法

渗透测试过程中&#xff0c;我们经常会需要文件传输&#xff0c;本文主要探讨Linux主机上我们对文件传输的方法。 编码方式 Linux 检查MD5 md5sum id_rsa Linux Base64 编码/解码 编码 cat id_rsa |base64 -w 0;echo 解码 echo -n LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVE…...

浅议Flink中的通讯工具: Akka

在Flink中&#xff0c;各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。 Akka是什么 Actor模型 Actor模型是用于单个进程中并发的场景。 在Actor模型中&#xff1a; ActorSystem负责管理actor生命周期 将每个实体视为独立的 Ac…...

基于YOLOv8深度学习的独居老人情感状态监护系统(PyQt5界面+数据集+训练代码)

本研究提出了一种创新的独居老人情感状态监护系统&#xff0c;基于YOLOV8深度学习模型&#xff0c;旨在通过对老年人面部表情的实时监测与分析&#xff0c;来精准识别其情感变化&#xff0c;从而提高独居老人的生活质量&#xff0c;确保其心理健康。本系统通过整合先进的YOLOV8…...

Qt添加外部库:静态库和动态库,批量添加头文件

Qt添加外部库需要知道库文件的位置才能正确链接&#xff0c;如果是静态库&#xff0c;要确保LIBS变量中包含正确的库文件路径和库文件名;如果是动态库&#xff0c;除了库路径外&#xff0c;还需要考虑动态库的加载路径。在 Windows 下&#xff0c;可以将动态库所在路径添加到系…...

Unity类银河战士恶魔城学习总结(P132 Merge skill tree with skill Manager 把技能树和冲刺技能相组合)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了解锁技能后才可以使用技能&#xff0c;先完成了冲刺技能的锁定解锁 Dash_Skill.cs using System.Collections; using System…...

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…...

DNS实验作业

实验要求 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 实验步骤&#xff1a; 1.关闭防护墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2.正向解析 [rootlo…...

yolo系列演进分析

YOLO(You Only Look Once)作为计算机视觉领域最具影响力的目标检测算法系列之一,自2016年首次提出以来经历了持续的技术革新与架构演进。从最初的YOLOv1到2026年最新发布的YOLO26,这一系列不仅实现了从"单阶段检测"到"端到端推理"的范式转变,更在速度…...

开发者专属配置:OpenClaw+GLM-4-7-Flash优化命令行工作效率

开发者专属配置&#xff1a;OpenClawGLM-4-7-Flash优化命令行工作效率 1. 为什么开发者需要AI增强命令行&#xff1f; 作为每天与终端打交道的开发者&#xff0c;我经常遇到这样的困境&#xff1a;忘记复杂的grep参数组合、需要反复查阅历史命令、或是面对一长串docker compo…...

如何快速美化Windows任务栏:TranslucentTB完全指南

如何快速美化Windows任务栏&#xff1a;TranslucentTB完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows系统一…...

保姆级教程:Windows下GDC-client下载TCGA数据的完整配置流程(含环境变量与配置文件修改)

Windows平台TCGA数据下载全流程&#xff1a;从环境配置到实战避坑指南 在生物信息学研究中&#xff0c;TCGA数据库无疑是癌症基因组学的宝库。但对于刚入门的研究者来说&#xff0c;获取这些数据往往成为第一道门槛。本文将彻底解决Windows用户在使用GDC-client工具时的各种&qu…...

HunyuanVideo-Foley实战指南:FFmpeg后处理添加混响/均衡/压缩提升商用质量

HunyuanVideo-Foley实战指南&#xff1a;FFmpeg后处理添加混响/均衡/压缩提升商用质量 1. 引言&#xff1a;为什么需要音效后处理 在视频制作领域&#xff0c;专业级音效是提升作品质量的关键因素。HunyuanVideo-Foley生成的原始音效虽然已经具备良好的基础&#xff0c;但通过…...

别再手写Verilog了!用Intel Platform Designer(Qsys)在DE2-115上5分钟搭个LED控制器

图形化革命&#xff1a;5分钟用Platform Designer构建FPGA系统的实战指南 从代码到模块化思维的转变 在传统FPGA开发中&#xff0c;工程师往往需要从零开始编写Verilog代码&#xff0c;即使是简单的LED控制逻辑也不例外。这种开发方式不仅效率低下&#xff0c;而且容易出错——…...

RWKV7-1.5B-g1a部署教程:适配A10/A100/V100等主流GPU,显存占用稳定3.8GB

RWKV7-1.5B-g1a部署教程&#xff1a;适配A10/A100/V100等主流GPU&#xff0c;显存占用稳定3.8GB 1. 模型简介 rwkv7-1.5B-g1a是基于新一代RWKV-7架构的多语言文本生成模型&#xff0c;特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时&#xff0…...

OpenClaw安全加固实践:Qwen3-32B私有镜像+本地防火墙配置

OpenClaw安全加固实践&#xff1a;Qwen3-32B私有镜像本地防火墙配置 1. 为什么需要安全加固&#xff1f; 当我第一次看到OpenClaw能够自动操作我的电脑时&#xff0c;既兴奋又担忧。兴奋的是它能够帮我完成重复性工作&#xff0c;担忧的是它本质上是一个拥有系统操作权限的AI…...

OpenClaw私有化部署详解:Qwen3-VL:30B+飞书机器人配置

OpenClaw私有化部署详解&#xff1a;Qwen3-VL:30B飞书机器人配置 1. 为什么选择私有化部署 去年我在尝试将AI助手引入团队工作流时&#xff0c;遇到了两个棘手问题&#xff1a;一是敏感数据不敢上传到公有云&#xff0c;二是现有解决方案的响应速度总是不尽如人意。直到发现O…...

隐私优先的WiFi人体姿态追踪:RuView如何用无线信号“看见“人体

隐私优先的WiFi人体姿态追踪&#xff1a;RuView如何用无线信号"看见"人体 【免费下载链接】RuView Production-ready implementation of InvisPose - a revolutionary WiFi-based dense human pose estimation system that enables real-time full-body tracking thr…...