[文章]基于ArkTS语言的OpenHarmony APP应用开发:自定义通知

阅读量0
0
0

1、程序介绍

本示例展示了如何初始化不同类型通知的通知内容以及通知的发布、取消,包括基本类型、长文本类型、多行文本类型、图片类型、带按钮的通知、点击可跳转到应用的通知。

本案例已在OpenHarmony凌蒙派-RK3568开发板验证通过,具体代码可参考:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/d04_CustomNotification

API接口:9

2、知识准备

2.1、Notification模块

本模块提供通知管理的能力,包括发布、取消发布通知,创建、获取、移除通知通道,订阅、取消订阅通知,获取通知的使能状态、角标使能状态,获取通知的相关信息等。

以下将简要讲解本次实验应用的知识点。如需详细接口说明,请参看:Notification模块官方说明

2.1.1、导入模块

import Notification from '@ohos.notification';

2.1.2、Notification简介

// 导入模块
import Notification from '@ohos.notification';
​
// notification模块
declare namespace notification {
// 发布通知
  function publish(request: NotificationRequest, callback: AsyncCallback<void>): void;
// 取消通知
  function cancel(id: number, callback: AsyncCallback<void>): void;
// 取消所有
  function cancelAll(callback: AsyncCallback<void>): void;
// 获取当前应用的活动通知数
  function getActiveNotificationCount(callback: AsyncCallback<number>): void;
// 获取所有有效的通知
  function getActiveNotifications(callback: AsyncCallback<Array<NotificationRequest>>): void;
  
  // 省略部分API
}

(1)publish:发布一条通知,NotificationRequest 参数说明如下:

  • id:通知ID,可通过此ID取消该通知。
  • content:通知内容。
  • isUnremovable:是否可移除。
  • extraInfo:扩展参数。
  • smallIcon:通知小图标。
  • largeIcon:通知大图标。
  • isFloatingIcon:是否显示状态栏图标。
  • wantAgent:点击通知跳转的WantAgent。
  • autoDeletedTime:通知自动清楚的时间。

(2)cancel:取消与指定 id 相匹配的已发布通知。

(3)cancelAll:取消所有已发布的通知。

(4)getActiveNotificationCount:获取当前应用的活动通知数。

(5)getActiveNotifications:获取当前应用的所有活动通知。

2.1.3、publish函数

Notification.publish(request: NotificationRequest): Promise<void>

作用:发布通知(Promise形式)。

参数:

参数名 类型 必填 说明
request NotificationRequest 用于设置要发布通知的内容和相关配置信息。

示例:

// 通知Request对象
let notificationRequest = {
    notificationId: 1,// 
    content: {// 通知内容
        contentType: Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,// 通知类型
        normal: {
            title: "test_title",// 通知内容的标题
            text: "test_text",// 通知内容的文本
            additionalText: "test_additionalText"// 通知附加内容,是对通知内容的补充。
        }
    }
};
Notification.publish(notificationRequest).then(() => {
console.info("publish success");
});

2.1.4、ContentType类型

系统能力:以下各项对应的系统能力均为SystemCapability.Notification.Notification

名称 说明
NOTIFICATION_CONTENT_BASIC_TEXT NOTIFICATION_CONTENT_BASIC_TEXT 普通类型通知。
NOTIFICATION_CONTENT_LONG_TEXT NOTIFICATION_CONTENT_LONG_TEXT 长文本类型通知。
NOTIFICATION_CONTENT_PICTURE NOTIFICATION_CONTENT_PICTURE 图片类型通知。
NOTIFICATION_CONTENT_CONVERSATION NOTIFICATION_CONTENT_CONVERSATION 社交类型通知。
NOTIFICATION_CONTENT_MULTILINE NOTIFICATION_CONTENT_MULTILINE 多行文本类型通知。

3、程序解析

3.1、创建NotificationOperations对象

NotificationOperations主要用来发布不同类型的通知。具体流程如下:

首先,引入Notification模块。

import {
  logger,
  notificationUtil,
  notificationContentUtil,
  notificationRequestUtil,
  wantAgentUtil
} from '@ohos/notification'
import notification from '@ohos.notificationManager'

其次,定义一个NotificationOperations类。

export default class NotificationOperations {
  private context: Context = undefined
  private basicContent: notification.NotificationBasicContent = undefined
  ......
}

NotificationOperations类定义为默认类对象,方便主页面调用。

最后,在NotificationOperations类中声明不同类型的通知,以供主页面调用。

3.1.1、发布基本类型通知

publishBasicNotification = () => {
    try {
      logger.info(TAG, `publishBasicNotification`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.basic_notification'))
      let notificationContent = notificationContentUtil.initBasicNotificationContent(this.basicContent)
      // 发布普通类型通知
      notificationUtil.publishNotification(notificationRequestUtil.initBasicNotificationRequest(notificationContent), NOTIFICATION_ID.BASIC)
    } catch (error) {
      logger.info(TAG, `publishBasicNotification error, error = ${JSON.stringify(error)}`)
    }
}

3.1.2、发布长文本类型通知

publishLongTextNotification = () => {
    try {
      logger.info(TAG, `publishLongTextNotification`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.long_text_notification'))
      let notificationLongText = this.context.resourceManager.getStringSync($r('app.string.notification_long_text'))
      let notificationBriefText = this.context.resourceManager.getStringSync($r('app.string.notification_brief_text'))
      let notificationExpandedText = this.context.resourceManager.getStringSync($r('app.string.notification_expanded_title'))
      let notificationContent = notificationContentUtil.initNotificationLongTextContent(this.basicContent, notificationLongText, notificationBriefText, notificationExpandedText)
      notificationUtil.publishNotification(notificationRequestUtil.initBasicNotificationRequest(notificationContent), NOTIFICATION_ID.LONG_TEXT)
    } catch (error) {
      logger.info(TAG, `publishLongTextNotification error, error = ${JSON.stringify(error)}`)
    }
}

3.1.3、发布多行文本类型通知

publishMultiLineNotification = () => {
    try {
      logger.info(TAG, `publishMultiLineNotification`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.multiline_notification'))
      let notificationBriefText = this.context.resourceManager.getStringSync($r('app.string.notification_brief_text'))
      let notificationLongTitle = this.context.resourceManager.getStringSync($r('app.string.notification_expanded_title'))
      let notificationContent = notificationContentUtil.initNotificationMultiLineContent(this.basicContent, notificationBriefText, notificationLongTitle, MULTI_LINE_CONTENT)
      notificationUtil.publishNotification(notificationRequestUtil.initBasicNotificationRequest(notificationContent), NOTIFICATION_ID.MULTI_LINE)
    } catch (error) {
      logger.info(TAG, `publishMultiLineNotification error, error = ${JSON.stringify(error)}`)
    }
}

3.1.4、发布图片类型通知

publishPictureNotification = async () => {
    try {
      logger.info(TAG, `publishPictureNotification`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.picture_notification'))
      let notificationBriefText = this.context.resourceManager.getStringSync($r('app.string.notification_brief_text'))
      let notificationExpandedText = this.context.resourceManager.getStringSync($r('app.string.notification_expanded_title'))
      let imageArray = await this.context.resourceManager.getMedia($r('app.media.notification_icon').id)
      let imageResource = image.createImageSource(imageArray.buffer)
      let picture = await imageResource.createPixelMap()
      let notificationContent = notificationContentUtil.initNotificationPictureContent(this.basicContent, notificationBriefText, notificationExpandedText, picture)
      notificationUtil.publishNotification(notificationRequestUtil.initBasicNotificationRequest(notificationContent), NOTIFICATION_ID.PICTURE)
    } catch (error) {
      logger.info(TAG, `publishPictureNotification error, error = ${JSON.stringify(error)}`)
    }
}

3.1.5、发布带按钮的通知

publishNotificationWithButtons = async () => {
    try {
      logger.info(TAG, `publishNotificationWithButtons`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.notification_with_buttons'))
      let actionButtons = [
        {
          title: this.context.resourceManager.getStringSync($r('app.string.first_button')),
          wantAgent: await wantAgentUtil.createWantAgentForCommonEvent('')
        },
        {
          title: this.context.resourceManager.getStringSync($r('app.string.second_button')),
          wantAgent: await wantAgentUtil.createWantAgentForStartAbility(BUNDLE_NAME, ABILITY_NAME)
        }
      ]
      let notificationContent = notificationContentUtil.initBasicNotificationContent(this.basicContent)
      let notificationRequest = notificationRequestUtil.initButtonNotificationRequest(notificationContent, actionButtons)
      notificationUtil.publishNotification(notificationRequest, NOTIFICATION_ID.BUTTON)
    } catch (error) {
      logger.info(TAG, `publishNotificationWithButtons error, error = ${JSON.stringify(error)}`)
    }
}

3.1.6、发布点击跳转到应用的通知

publishNotificationWithWantAgent = async () => {
    try {
      logger.info(TAG, `publishNotificationWithWantAgent`)
      this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.clickable_notification'))
      let notificationWantAgent = await wantAgentUtil.createWantAgentForStartAbility(BUNDLE_NAME, ABILITY_NAME)
      let notificationContent = notificationContentUtil.initBasicNotificationContent(this.basicContent)
      let notificationRequest = notificationRequestUtil.initWantAgentNotificationRequest(notificationContent, notificationWantAgent)
      notificationUtil.publishNotification(notificationRequest, NOTIFICATION_ID.WANTAGENT)
    } catch (error) {
      logger.info(TAG, `publishNotificationWithWantAgent error, error = ${JSON.stringify(error)}`)
    }
}

3.2、主页面

主页面负责定义按钮以及调用发布函数。

import router from '@ohos.router'
import NotificationOperations from '../feature/NotificationOperations'
import { notificationUtil } from '@ohos/notification'@Entry
@Component
struct Index {
  private notificationOperations: NotificationOperations = new NotificationOperations(getContext(this))
​
  @Builder TitleBar() {
    Row() {
      Image($r('app.media.ic_back'))
        .size({ width: 30, height: 30 })
        .margin({ left: 12 })
        .onClick(() => {
          router.back()
        })
      Text($r('app.string.MainAbility_label'))
        .fontSize(24)
        .margin({ left: 12 })
    }
    .width('100%')
    .height(70)
    .backgroundColor('#F1F3F5')
  }
​
  @Styles buttonStyle(){
    .width(230)
    .height(50)
    .margin(10)
  }
​
  build() {
    Column() {
      this.TitleBar()
      Scroll() {
        Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Center }) {
          Button($r('app.string.basic_notification'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishBasicNotification)
          Button($r('app.string.long_text_notification'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishLongTextNotification)
          Button($r('app.string.multiline_notification'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishMultiLineNotification)
          Button($r('app.string.picture_notification'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishPictureNotification)
          Button($r('app.string.notification_with_buttons'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishNotificationWithButtons)
          Button($r('app.string.clickable_notification'))
            .buttonStyle()
            .onClick(this.notificationOperations.publishNotificationWithWantAgent)
          Button($r('app.string.cancel_all_notifications'))
            .buttonStyle()
            .onClick(()=>{
              notificationUtil.cancelAllNotifications()
            })
        }
        .width('100%')
        .padding(12)
      }
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
  }
​
  aboutToAppear() {
    notificationUtil.enableNotification()
  }
}

4、项目编译

4.1、打开项目

打开DevEco Studio,再打开自定义通知项目。

4.2、编译程序

点击菜单栏上的“Build” -> "Rebuild Project"。如果出现无法编译,则注意查看Event Log界面。如下所示:
question_npm_install.png
点击Run 'npm install',让DevEco Studio安装相关依赖包。

重新点击菜单栏上的“Build” -> "Rebuild Project"。出现如下错误:
question_root_module.png点击上图红色框部分,安装相关服务。

重新点击菜单栏上的“Build” -> "Rebuild Project",编译成功。
rebuild_project_successful.png

4.3、安装程序

点击“entry”按钮,将项目程序安装到设备端。如下图所示:
heap_install_to_device.png
如果出现下述报错,表示无法安装。如图所示:
heap_install_failed.png

点击上图红色框的蓝色字体,弹出"Project Structure"对话框,点击"Apply",再点击"OK"。如图所示:
project_structure.png

重新点击“entry”按钮,将项目程序安装到设备端。
entry_successful.png

5、运行结果

微信截图_20240914150357.png

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友