鸿蒙NEXT开发-用户通知服务

news/2025/2/26 8:44:56

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

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

目录

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

2. 能力范围

3. 业务流程

4. 用户通知服务-基础通知

4.1 基本介绍

4.2 接口方法

4.3 代码示例

5. 用户通知服务-进度条通知

5.1 基本介绍

5.2 接口方法

5.3 代码示例

6. 用户通知服务-通知行为意图

6.1 基本介绍

6.2 接口方法

6.3 代码示例


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 接口方法

接口名

描述

publish(request: NotificationRequest, callback: AsyncCallback<void>): void

发布通知。

cancel(id: number, label: string, callback: AsyncCallback<void>): void

取消指定的通知。

cancelAll(callback: AsyncCallback<void>): void

取消所有该应用发布的通知。

4.3 代码示例

import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit';

// 日志标识
const TAG: string = '[publishTest]';
const DOMAIN_NUMBER: number = 0xFF00;
let context = getContext(this) as common.UIAbilityContext;

@Entry
@Component
struct Index {
  /**
   * 请求通知授权
   */
  aboutToAppear(): void {
    notificationManager.isNotificationEnabled().then((data: boolean) => {
      hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
      if (!data) {
        notificationManager.requestEnableNotification(context).then(() => {
          hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
        }).catch((err: BusinessError) => {
          if (1600004 == err.code) {
            hilog.error(DOMAIN_NUMBER, TAG,
              `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
          } else {
            hilog.error(DOMAIN_NUMBER, TAG,
              `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
          }
        });
      }
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
    });
  }

  /**
   * 通知方法
   */
  publish() {
    let notificationRequest: notificationManager.NotificationRequest = {
      // 通知的唯一id
      id: 1,
      content: {
        notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知
        normal: {
          // 通知的标题
          title: '百得知识库',
          // 通知的内容
          text: '百得知识库提醒你该学习了',
          // 附加消息
          additionalText: '百得',
        }
      }
    };
    notificationManager.publish(notificationRequest, (err: BusinessError) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG,
          `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
    });
  }

  /**
   * 取消指定的通知
   */
  cancelPublish() {
    notificationManager.cancel(1, (err: BusinessError) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG,
          `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.');
    });
  }

  build() {
    Column({ space: 20 }) {

      Button('发布文本类型通知')
        .onClick(() => {
          this.publish()
        })

      Button('取消通知')
        .onClick(() => {
          this.cancelPublish()
        })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

5. 用户通知服务-进度条通知

5.1 基本介绍

进度条通知也是常见的通知类型,主要应用于文件下载、事务处理进度显示。当前系统提供了进度条模板,发布通知应用设置好进度条模板的属性值,如模板名、模板数据,通过通知子系统发送到通知栏显示。

5.2 接口方法

接口名

描述

isSupportTemplate(templateName: string): Promise<boolean>

查询模板是否存在。

5.3 代码示例

import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { promptAction } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';

const TAG: string = '[publishTest]';
const DOMAIN_NUMBER: number = 0xFF00;
let context = getContext(this) as common.UIAbilityContext;

@Entry
  @Component
  struct Page {
    /**
   * 请求通知授权
   */
    aboutToAppear(): void {
      notificationManager.isNotificationEnabled().then((data: boolean) => {
        hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
        if (!data) {
          notificationManager.requestEnableNotification(context).then(() => {
            hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
          }).catch((err: BusinessError) => {
            if (1600004 == err.code) {
              hilog.error(DOMAIN_NUMBER, TAG,
                          `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
            } else {
              hilog.error(DOMAIN_NUMBER, TAG,
                          `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
            }
          });
        }
      }).catch((err: BusinessError) => {
        hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
      });
    }

    /**
   * 发布通知
   */
    publish() {
      // 查询系统是否支持进度条模板
      notificationManager.isSupportTemplate('downloadTemplate').then((data: boolean) => {
        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in supporting download template notification.');
        let isSupportTpl: boolean = data;
        // isSupportTpl的值为true表示支持downloadTemplate模板类通知,false表示不支持
        if (isSupportTpl) {
          let notificationRequest: notificationManager.NotificationRequest = {
            id: 1,
            content: {
              notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
              normal: {
                title: '东林视频',
                text: '东林视频下载',
                additionalText: '东林'
              }
            },
            // 构造进度条模板,name字段当前需要固定配置为downloadTemplate
            template: {
              name: 'downloadTemplate',
              data: { title: '东林视频', fileName: '搞笑.mp4', progressValue: 80 }
            }
          }

          // 发布通知
          notificationManager.publish(notificationRequest, (err: BusinessError) => {
            if (err) {
              hilog.error(DOMAIN_NUMBER, TAG,
                          `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
              return;
            }
            hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
          });
        } else {
          promptAction.showToast({
            message: '不支持进度条通知'
          })
        }
      }).catch((err: BusinessError) => {
        hilog.error(DOMAIN_NUMBER, TAG,
                    `Failed to support download template notification. Code is ${err.code}, message is ${err.message}`);
    });


  }

  /**
   * 取消发布
   */
  cancelPublish() {
    notificationManager.cancel(1, (err: BusinessError) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG, `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.');
    });
  }

  build() {
    Column() {
      Button('发布进度条通知').onClick(() => {
        this.publish()
      }).margin(100)
      Button('取消发布进度条通知').onClick(() => {
        this.cancelPublish()
      })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

注意:东林在下节案例给大家具体说下载进度条的用法,真实的模拟下载进度通知

6. 用户通知服务-通知行为意图

6.1 基本介绍

当发布通知时,如果期望用户可以通过点击通知栏拉起目标应用组件或发布公共事件,可以通过Ability Kit申请WantAgent封装至通知消息中。

6.2 接口方法

接口名

描述

getWantAgent(info: WantAgentInfo, callback: AsyncCallback<WantAgent>): void

创建WantAgent。

6.3 代码示例

import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit';
import { wantAgent, WantAgent } from '@kit.AbilityKit'

// 日志标识
const TAG: string = '[publishTest]';
const DOMAIN_NUMBER: number = 0xFF00;
let context = getContext(this) as common.UIAbilityContext;

@Entry
@Component
struct Page2 {
  /**
   * 请求通知授权
   */
  aboutToAppear(): void {
    notificationManager.isNotificationEnabled().then((data: boolean) => {
      hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
      if (!data) {
        notificationManager.requestEnableNotification(context).then(() => {
          hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
        }).catch((err: BusinessError) => {
          if (1600004 == err.code) {
            hilog.error(DOMAIN_NUMBER, TAG,
              `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
          } else {
            hilog.error(DOMAIN_NUMBER, TAG,
              `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
          }
        });
      }
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
    });
  }

  /**
   * 通知方法
   */
  publish() {

    let wantAgentObj:WantAgent; // 用于保存创建成功的wantAgent对象,后续使用其完成触发的动作。
    // 通过WantAgentInfo的operationType设置动作类型
    let wantAgentInfo:wantAgent.WantAgentInfo = {
      wants: [
        {
          deviceId: '',
          bundleName: 'com.xt.myapplication',
          abilityName: 'EntryAbility',
          action: '',
          entities: [],
          uri: '',
          parameters: {}
        }
      ],
      actionType: wantAgent.OperationType.START_ABILITY,
      requestCode: 0,
      wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG]
    };

    // 创建WantAgent
    wantAgent.getWantAgent(wantAgentInfo, (err: BusinessError, data:WantAgent) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG, `Failed to get want agent. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in getting want agent.');
      wantAgentObj = data;

      let notificationRequest: notificationManager.NotificationRequest = {
        // 通知的唯一id
        id: 1,
        content: {
          notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知
          normal: {
            // 通知的标题
            title: '百得知识库',
            // 通知的内容
            text: '百得知识库提醒你该学习了',
            // 附加消息
            additionalText: '百得',
          }
        },
        // wantAgentObj使用前需要保证已被赋值(即步骤3执行完成)
        wantAgent: wantAgentObj,
      };
      notificationManager.publish(notificationRequest, (err: BusinessError) => {
        if (err) {
          hilog.error(DOMAIN_NUMBER, TAG,
            `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
          return;
        }
        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
      });
    });
  }

  /**
   * 取消指定的通知
   */
  cancelPublish() {
    notificationManager.cancel(1, (err: BusinessError) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG,
          `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.');
    });
  }

  build() {
    Column({ space: 20 }) {

      Button('发布文本类型通知')
        .onClick(() => {
          this.publish()
        })

      Button('取消通知')
        .onClick(() => {
          this.cancelPublish()
        })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}


http://www.niftyadmin.cn/n/5868410.html

相关文章

笔记20250225

关于上拉电阻和下拉电阻的作用 原理 上拉电阻&#xff1a;在上拉电阻所连接的导线上&#xff0c;如果外部组件未启用&#xff0c;上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时&#xff0c;对输入端来说&#xff0c;外部“看上去”就是高阻抗的&#xff0c…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

系统调用过程

注意&#xff1a;本系统调用过程基于32位操作系统 中断服务程序的寻址过程 1.用户态程序产生系统调用write()&#xff1b; 2.产生中断指令ENTER_KERNEL(int $0x80128)&#xff0c;CPU收到中断指令去查询中断向量表&#xff0c;找出中断号0x80对应的中断服务程序的内存基地址(0…

C# string转unicode字符

在 C# 中&#xff0c;将字符串转换为 Unicode 字符&#xff08;即每个字符的 Unicode 码点&#xff09;可以通过遍历字符串中的每个字符并获取其 Unicode 值来实现。Unicode 值是一个整数&#xff0c;表示字符在 Unicode 标准中的唯一编号。 以下是实现方法&#xff1a; 1. 获…

[H滑动窗口] lc239. 滑动窗口最大值(模拟+数据结构+单调队列+滑动窗口模板题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;239. 滑动窗口最大值 相关博文&#xff1a; [单调队列模板] 单调队列模板 题单&#xff1a; 待补充 2. 题目解析 一道单调队列模板题&#xff0c;不赘述了吧。 看看日后有没有写不出来来补题、或者有新…

深入理解 `Sinks.Empty<Void>` 和 `Mono<Void>`:如何触发完成信号并结合 WebSocket 示例

在响应式编程中&#xff0c;Sinks 是 Project Reactor 提供的一个强大工具&#xff0c;用于手动控制数据流的信号发射。Sinks.Empty<Void> 是一种特殊的 Sinks&#xff0c;它不发射任何数据&#xff0c;仅用于表示完成或错误信号。结合 Mono<Void>&#xff0c;它可…

网络基础知识-2

N个节点完全互联的网型网即N个节点的无向完全图&#xff0c;无向完全图的边数计算如下&#xff1a;每个节点都要指向其他N-1个节点&#xff0c;但是因为无向两个节点之间的边会重复&#xff0c;因此有N(N-1)/2条边HDLC&#xff08;高级数据链路控制协议&#xff09;是一种面向比…

二叉树-左叶子之和

代码随想录-刷题笔记 404. 左叶子之和 - 力扣&#xff08;LeetCode&#xff09; 内容&#xff1a; 该题仅作为搜索&#xff0c;但是其中的规则让人摸不着头脑&#xff0c;看起来似乎很头疼 但是仔细一思考&#xff0c;能发现左叶子无非是这样的定义 当发现一个节点的 左孩…