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

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

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

目录

[1. 用户通知服务基本介绍](#1. 用户通知服务基本介绍)

[2. 能力范围](#2. 能力范围)

[3. 业务流程](#3. 业务流程)

[4. 用户通知服务-基础通知](#4. 用户通知服务-基础通知)

[4.1 基本介绍](#4.1 基本介绍)

[4.2 接口方法](#4.2 接口方法)

[4.3 代码示例](#4.3 代码示例)

[5. 用户通知服务-进度条通知](#5. 用户通知服务-进度条通知)

[5.1 基本介绍](#5.1 基本介绍)

[5.2 接口方法](#5.2 接口方法)

[5.3 代码示例](#5.3 代码示例)

[6. 用户通知服务-通知行为意图](#6. 用户通知服务-通知行为意图)

[6.1 基本介绍](#6.1 基本介绍)

[6.2 接口方法](#6.2 接口方法)

[6.3 代码示例](#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)
  }
}
相关推荐
m0_6855350819 小时前
华为光学工程师笔试真题(含答案与深度解析)
华为·光学·光学设计·光学工程·镜头设计
lqj_本人19 小时前
鸿蒙原生与Qt混合开发:性能优化与资源管理
qt·harmonyos
lqj_本人19 小时前
鸿蒙Qt字体实战:消灭“豆腐块“乱码与自定义字体加载
qt·华为·harmonyos
大侠课堂19 小时前
海康大华大疆华为中兴追觅经典面试题200道完整版
华为
爱笑的眼睛1120 小时前
深入探索HarmonyOS中RichText组件的HTML渲染机制
华为·harmonyos
IT闫20 小时前
figlet 在鸿蒙PC上的构建与适配
华为·harmonyos
全栈陈序员20 小时前
Whois 工具在 HarmonyOS PC 上的交叉编译实践
华为·harmonyos
空白诗21 小时前
tokei 在鸿蒙PC上的构建与适配
后端·华为·rust·harmonyos
汉堡黄21 小时前
鸿蒙开发:案例集合Tabs:分段按钮组件
harmonyos
哈__21 小时前
exa 在 HarmonyOS 上的构建与适配
elasticsearch·华为·harmonyos