OpenHarmony开发案例:【自定义通知】

 

介绍

本示例使用[@ohos.notificationManager] 等接口,展示了如何初始化不同类型通知的通知内容以及通知的发布、取消及桌面角标的设置,通知类型包括基本类型、长文本类型、多行文本类型、图片类型、带按钮的通知、点击可跳转到应用的通知。

效果预览:

image.png

使用说明

1.启动应用后,弹出是否允许发送通知的弹窗,点击允许后开始操作;

2.点击界面中对应的按钮发布不同类型的通知,下拉状态栏,在通知栏可以看到发布的通知;

3.打开提示音和震动效果开关后,再点击对应按钮发布不同类型的通知,在通知的同时会伴有提示音或震动效果;

4.点击消息列表Tab页,可以查看到刚才发送的消息,消息右边会显示数量,点击相应的消息可进行消息读取,取消相应通知;

5.回到仿桌面,可以看到角标数量,对应消息数量(使用前需安装并启动[仿桌面应用]);

6.点击取消所有通知,可以取消本应用发布的所有通知;

代码解读

鸿蒙开发文档参考了:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

entry/src/main/ets/
|---Application
|---components
|   |---NotificationList.ets                 //通知列表控件
|   |---NotificationPublish.ets              //通知发送控件
|   |---TitleBar.ets                         //标题控件
|---feature
|   |---NotificationOperations.ets           // 对外提供发布通知的接口
|---MainAbility
|---pages
|   |---Index.ets                            // 首页
entry/src/ohosTest/ets/
|---test
|   |---Index.test.ets                       // 首页的自动化测试    
notification/src/main/ets/
|---notification
|   |---NotificationContentUtil.ets          // 封装各种通知的主体内容
|   |---NotificationManagementUtil.ets       // 封装消息列表,角标设置的接口
|   |---NotificationRequestUtil.ets          // 接收通知的主体内容,返回完整的通知
|   |---NotificationUtil.ets                 // 封装允许发布通知、发布通知、关闭通知的接口
|   |---WantAgentUtil.ets                    // 封装wantAgent
|---util                                     // 日志文件

具体实现

搜狗高速浏览器截图20240326151450.png

  • 允许发送通知、发送通知、取消通知的功能接口封装在NotificationUtil,源码参考:[NotificationUtil.ets]
/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import notification from '@ohos.notificationManager'import { logger } from '../util/Logger'import { notificationManagement } from '../notification/NotificationManagementUtil';const TAG: string = 'NotificationUtil'class NotificationUtil {private isPromptTone: boolean = false;private isVibrationEffect: boolean = false;promptTone(flag: boolean = this.isPromptTone): boolean {this.isPromptTone = flag;return this.isPromptTone;}vibrationEffect(flag: boolean = this.isVibrationEffect): boolean {this.isVibrationEffect = flag;return this.isVibrationEffect;}/*** enable notification*/async enableNotification() {try {await notification.requestEnableNotification();logger.info(TAG, `enableNotification success`);} catch (err) {logger.info(TAG, `enableNotification err ${JSON.stringify(err)}`);}}/**** @param notificationRequest* @param id, Support specifying notification id when publishing notifications*/async publishNotification(notificationRequest: notification.NotificationRequest, id?: number) {if (id && id > 0) {notificationRequest.id = id;}try {let notificationSlot: notification.NotificationSlot = {type: notification.SlotType.CONTENT_INFORMATION,level: notification.SlotLevel.LEVEL_DEFAULT};if (this.isPromptTone) {notificationSlot.sound = 'file:///system/etc/capture.ogg';}if (this.isVibrationEffect) {notificationSlot.vibrationEnabled = true;notificationSlot.vibrationValues = [200];}await notification.removeAllSlots();await notification.addSlot(notificationSlot.type);await notification.publish(notificationRequest);// 通知管理器添加新通知await notificationManagement.addNotification(notificationRequest);logger.info(TAG, `publish notification success, ${notificationRequest}`);} catch (err) {if (err) {logger.error(TAG, `publishNotification err ${JSON.stringify(err)}`);}}}/*** cancel notification by id*/async cancelNotificationById(id: number) {try {await notification.cancel(id);logger.info(TAG, `cancel success`);} catch (err) {if (err) {logger.info(TAG, `cancel err ${JSON.stringify(err)}`);}}}/*** cancel all notification*/async cancelAllNotifications() {try {await notification.cancelAll();logger.info(TAG, `cancel all success`);} catch (err) {if (err) {logger.info(TAG, `cancel all err ${JSON.stringify(err)}`);}}}}export let notificationUtil = new NotificationUtil();
  • 允许发送通知:在进入[Index.ets]前 通过notificationUtil.enableNotification()调用notification.requestEnableNotification()接口向用户请求发送通知;

  • 发送通知:通过publishNotification()封装发布通知的接口;

  • 取消通知:在[Index.ets]页面中通过点击事件调用cancelAllNotifications()取消所有的通知或者通过cancelNotificationById()取消指定id的通知;

  • 获取应用所有消息通知、取消相关类型通知,角标管理接口封装在NotificationManagementUtil,源码参考:[NotificationManagementUtil.ets]

/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import image from '@ohos.multimedia.image';import {logger,notificationUtil,notificationContentUtil,notificationRequestUtil,wantAgentUtil} from '@ohos/notification';import notification from '@ohos.notificationManager';interface notificationIdType {BASIC: number,LONG_TEXT: number,MULTI_LINE: number,PICTURE: number,BUTTON: number,WANTAGENT: number};const TAG: string = 'NotificationOperations';const BUNDLE_NAME: string = 'ohos.samples.customnotification';const ABILITY_NAME: string = 'MainAbility';const MULTI_LINE_CONTENT: Array<string> = ['line0', 'line1', 'line2', 'line3']; // 多行文本通知的多行文本内容const enum NOTIFICATION_ID { // 定义不同类型通知的通知idBASIC = 1,LONG_TEXT = 2,MULTI_LINE = 3,PICTURE = 4,BUTTON = 5,WANTAGENT = 6};export default class NotificationOperations {private context: Context | undefined = undefined;private basicContent: notification.NotificationBasicContent | undefined = undefined;// 在初始化函数初始化基本通知类型的参数constructor(context: Context) {this.context = context;let notificationTitle = '';let notificationText = this.context.resourceManager.getStringSync($r('app.string.notification_content'));let notificationAdditional = this.context.resourceManager.getStringSync($r('app.string.notification_additional'));this.basicContent = {title: notificationTitle,text: notificationText,additionalText: notificationAdditional};}// 发布基本类型通知publishBasicNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined) {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)}`);}}// 发布长文本类型通知publishLongTextNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布多行文本类型通知publishMultiLineNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布图片类型通知publishPictureNotification = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布带按钮的通知publishNotificationWithButtons = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {logger.info(TAG, `publishNotificationWithButtons`);this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.notification_with_buttons'));let actionButtons: notification.NotificationActionButton[] = [{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)}`);}}// 发布点击跳转到应用的通知publishNotificationWithWantAgent = async () => {try {logger.info(TAG, `publishNotificationWithWantAgent`);if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}}
  • 获取应用所有消息通知:在constructor() 构造函数中调用@ohos.notificationManager中的getActiveNotifications接口获取所有通知及相应类型通知数量,通过封装getAllNotifications() 对外提供接口获取当前消息及消息数量。

  • 取消相关类型通知:通过cancelNotificationType()封装取消相关通知类型的接口;

  • 角标管理接口:通过setBadgeNumber()封装设置应用角标数量的接口,通过getBadgeNumber()封装获取当前应用角标数量的接口。

  • 添加一条通知:通过addNotification()封装接口添加一条通知到消息管理器,当发送通知的时候进行调用。

  • NotificationOperations向外提供接口,在页面中调用它们来实现功能,源码参考:[NotificationOperations.ets]

/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import image from '@ohos.multimedia.image';import {logger,notificationUtil,notificationContentUtil,notificationRequestUtil,wantAgentUtil} from '@ohos/notification';import notification from '@ohos.notificationManager';interface notificationIdType {BASIC: number,LONG_TEXT: number,MULTI_LINE: number,PICTURE: number,BUTTON: number,WANTAGENT: number};const TAG: string = 'NotificationOperations';const BUNDLE_NAME: string = 'ohos.samples.customnotification';const ABILITY_NAME: string = 'MainAbility';const MULTI_LINE_CONTENT: Array<string> = ['line0', 'line1', 'line2', 'line3']; // 多行文本通知的多行文本内容const enum NOTIFICATION_ID { // 定义不同类型通知的通知idBASIC = 1,LONG_TEXT = 2,MULTI_LINE = 3,PICTURE = 4,BUTTON = 5,WANTAGENT = 6};export default class NotificationOperations {private context: Context | undefined = undefined;private basicContent: notification.NotificationBasicContent | undefined = undefined;// 在初始化函数初始化基本通知类型的参数constructor(context: Context) {this.context = context;let notificationTitle = '';let notificationText = this.context.resourceManager.getStringSync($r('app.string.notification_content'));let notificationAdditional = this.context.resourceManager.getStringSync($r('app.string.notification_additional'));this.basicContent = {title: notificationTitle,text: notificationText,additionalText: notificationAdditional};}// 发布基本类型通知publishBasicNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined) {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)}`);}}// 发布长文本类型通知publishLongTextNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布多行文本类型通知publishMultiLineNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布图片类型通知publishPictureNotification = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布带按钮的通知publishNotificationWithButtons = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {logger.info(TAG, `publishNotificationWithButtons`);this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.notification_with_buttons'));let actionButtons: notification.NotificationActionButton[] = [{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)}`);}}// 发布点击跳转到应用的通知publishNotificationWithWantAgent = async () => {try {logger.info(TAG, `publishNotificationWithWantAgent`);if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}}
  • 发布通知:在[Index.ets] 页面中通过点击事件调用NotificationOperations中封装的对应的方法,然后从NotificationContentUtil中获取对应的主体内容content, 将content传递给NotificationRequestUtil得到完整的发布信息,最后调用NotificationUtil.publishNotification()发布内容;

  • 播放提示音、马达震动的功能在NotificationUtil调用发布通知的接口处进行判断是否开启,源码参考:[NotificationOperations.ets]

/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import image from '@ohos.multimedia.image';import {logger,notificationUtil,notificationContentUtil,notificationRequestUtil,wantAgentUtil} from '@ohos/notification';import notification from '@ohos.notificationManager';interface notificationIdType {BASIC: number,LONG_TEXT: number,MULTI_LINE: number,PICTURE: number,BUTTON: number,WANTAGENT: number};const TAG: string = 'NotificationOperations';const BUNDLE_NAME: string = 'ohos.samples.customnotification';const ABILITY_NAME: string = 'MainAbility';const MULTI_LINE_CONTENT: Array<string> = ['line0', 'line1', 'line2', 'line3']; // 多行文本通知的多行文本内容const enum NOTIFICATION_ID { // 定义不同类型通知的通知idBASIC = 1,LONG_TEXT = 2,MULTI_LINE = 3,PICTURE = 4,BUTTON = 5,WANTAGENT = 6};export default class NotificationOperations {private context: Context | undefined = undefined;private basicContent: notification.NotificationBasicContent | undefined = undefined;// 在初始化函数初始化基本通知类型的参数constructor(context: Context) {this.context = context;let notificationTitle = '';let notificationText = this.context.resourceManager.getStringSync($r('app.string.notification_content'));let notificationAdditional = this.context.resourceManager.getStringSync($r('app.string.notification_additional'));this.basicContent = {title: notificationTitle,text: notificationText,additionalText: notificationAdditional};}// 发布基本类型通知publishBasicNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined) {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)}`);}}// 发布长文本类型通知publishLongTextNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布多行文本类型通知publishMultiLineNotification = () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布图片类型通知publishPictureNotification = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}// 发布带按钮的通知publishNotificationWithButtons = async () => {try {if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {logger.info(TAG, `publishNotificationWithButtons`);this.basicContent.title = this.context.resourceManager.getStringSync($r('app.string.notification_with_buttons'));let actionButtons: notification.NotificationActionButton[] = [{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)}`);}}// 发布点击跳转到应用的通知publishNotificationWithWantAgent = async () => {try {logger.info(TAG, `publishNotificationWithWantAgent`);if (this.context !== undefined && this.context !== null && this.basicContent !== undefined && this.basicContent !== null) {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)}`);}}}
  • 发布通知:在[Index.ets]通过publishNotification()封装发布通知的接口的同时,根据NotificationUtil类中对应变量的值判断是否开启了提示音或马达,若已开启,则执行对应代码段;

  • 控制提示音或马达的开关:在[Index.ets]通过调用NotificationUtil类两个方法对NotificationUtil类中对应变量进行更改,开启为true,关闭为false;

  • 自动化测试,对应用接口或系统接口进行单元测试,并且对基于UI操作进行UI自动化测试

  • 模拟点击:在Index.test.ets的beforeAll中调用startAbility()拉起应用并进入首页, 然后通过Driver的assertComponentExist、findComponent和findWindow等获取到对应组件的位置, 最后通过click()模拟出人工点击对应组件的效果;

  • 模拟各种操作流程:在Index.test.ets 的每个it里面,按一定逻辑顺序排好点击组件的顺序,从而模拟出人为操作的过程,最终,所有的it组成了整一个应用的自动化测试。

最后呢,很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

高清完整版请点击→《鸿蒙NEXT星河版开发学习文档》

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

《鸿蒙 (OpenHarmony)开发学习视频》

图片

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

OpenHarmony北向、南向开发环境搭建

图片

《鸿蒙开发基础》

  1. ArkTS语言

  2. 安装DevEco Studio

  3. 运用你的第一个ArkTS应用

  4. ArkUI声明式UI开发

  5. .……

图片

《鸿蒙开发进阶》

  1. Stage模型入门

  2. 网络管理

  3. 数据管理

  4. 电话服务

  5. 分布式应用开发

  6. 通知与窗口管理

  7. 多媒体技术

  8. 安全技能

  9. 任务管理

  10. WebGL

  11. 国际化开发

  12. 应用测试

  13. DFX面向未来设计

  14. 鸿蒙系统移植和裁剪定制

  15. ……

图片

《鸿蒙开发实战》

  1. ArkTS实践

  2. UIAbility应用

  3. 网络案例

  4. ……

图片

 获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习javaEE的日子 Day36 字符流

Day36 1.字符流 应用场景&#xff1a;操作纯文本数据 注意&#xff1a;字符流 字节流编译器 编译器&#xff1a;可以识别中文字符和非中文字符&#xff0c;非中文字符获取1个字节&#xff08;一个字节一个字符&#xff09;&#xff0c;编译器会根据编码格式获取中文字符对应的…

java ssh 银行票管理系统eclipse开发mysql数据库MVC模式java编程网页设计协同过滤算法推荐

一、源码特点 JSP ssh 银行票管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,…

​代码混淆的原理是什么?常见代码混淆方法介绍

本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被破&#xff0c;给APP安全带来巨大风险&#xff0c;因此开发者…

腾讯EdgeOne产品测评体验—Web安全的攻与防:云端防护一体化

目录 简介接入准备EdgeOne购买及接入服务器环境配置添加测试站点关闭防护 安全性能测试XSS攻击sql注入 站点加速测试代码测试通过在线工具对比测试Ping检测tcping网站测速 HTTPS证书 操作步骤优点 总结EdgeOne的优缺点 简介 EdgeOne&#xff0c;作为腾讯云推出的全新CDN解决方…

【网站项目】智能停车场管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

计算机网络(四)网络层

网络层 基本概念 网络互联&#xff1a; 将两个以上的计算机网络&#xff0c;通过一定的办法&#xff0c;用一种或多种通信处理设备(即中间设备)相互连接起来&#xff0c;以构成更大的网络系统。中间设备又称中间系统或中继系统 中继系统分为4种&#xff1a; 物理层中继系统…

如何重置root用户的密码

即进入Linux操作系统的救援模式去重置密码。 1.首先重启机器&#xff0c; 2.进入grup菜单&#xff0c;按上下键盘&#xff0c;让系统的启动停在这个界面&#xff0c; 3.选择这个grup菜单的第一项&#xff0c;可以看界面下面的提示&#xff0c;按字母e编辑这个系统的启动配置…

选择、插入、冒泡、计数、堆、归并、快速排序的Java代码汇总和GUI界面时间测试与讲解

运行效果&#xff1a; Video_2024-04-16_150519 文章目录 前言&#xff1a;排序算法在数据结构和算法中的重要性一、排序算法详解1.选择排序2.插入排序3.冒泡排序4.计数排序5.堆排序6.归并排序7.快速排序 二、实现一个可以计算时间的Java GUI排序应用程序 前言&#xff1a;排序…

HCIP的学习(8)

OSPF数据报文 OSPF头部信息&#xff08;公共固定&#xff09; 版本&#xff1a;OSPF版本&#xff0c;在IPv4网络中版本字段恒定为数值2&#xff08;v1属于实验室版本&#xff0c;v3属于IPv6&#xff09;类型&#xff1a;代表具体是哪一种报文&#xff0c;按照1~5排序&#xff…

山姆·奥特曼是如何成为亿万富豪的?

2017年夏天&#xff0c;Superhuman公司首席执行官拉胡尔沃拉&#xff08;Rahul Vohra&#xff09;开始疯狂向投资者一一发消息&#xff0c;缘由是他的初创公司尝试了谷歌浏览器Chrome的一项即将推出的更新。由于一个看似无害的代码更改&#xff0c;Superhuman的智能电子邮件服务…

Linux系统编程---进程(一)

一、进程的相关概念 进程和程序&#xff1a; 我们平时写好的代码&#xff0c;通过编译后生成的可执行文件就是一个程序&#xff0c;不占用系统资源(cpu、内存、打开的文件、设备、锁....)&#xff0c;当这个程序被运行起来后(没结束之前) 它就成为了一个进程&#xff0c;进程…

OpenAI开设首个亚洲办公室,定制GPT-4模型Token成本降低47%|TodayAI

OpenAI今日宣布&#xff0c;在日本东京设立新办公室&#xff0c;标志着该公司在亚洲市场的正式扩展。东京作为全球科技领域的领导者&#xff0c;其独特的服务文化和创新社区&#xff0c;是OpenAI选择作为亚洲第一站的理想地点。公司致力于与日本政府、当地企业和研究机构合作&a…