关键词:
作者:张明伟
前言
通知是手机软件的消息推送,一般需要设置通知的权限为允许通知才能在状态栏查看到通知。主要有以下使用场景:
-
app内的通知:如微信新消息的提醒,以及一些APP广告的推送,APP版本更新;
-
系统的通知,如电量过低,短信提醒等;
- 显示正在进行的事件,如音乐播放,下载等都是通知。
效果展示
实现步骤
1. 定义触发通知的事件
1.1 首先需要定义UI
(一般情况下,不需要UI,本实例为了能方便获取触发事件而定义UI)
<!--文本通知按钮-->
<button class="button_notification" onclick="clickStartInputNotification">
$t(strings.startInputNotifiction)
</button>
<!--图片通知按钮-->
<button class="button_notification" onclick="clickStartButtonNotifiction">
$t(strings.startButtonNotifiction)
</button>
<!--取消通知-->
<button class="button_notification" onclick="clickCancelNotification">
$t(strings.cancelNotifiction)
</button>
1.2 实现JS FA调用PA的逻辑,并实现点击事件
import prompt from @system.prompt;
export default
//文本通知
clickStartInputNotification:function()
this.showToast("clickStartInputNotification");
this.notification(0x1001);
,
//图片通知
clickStartButtonNotifiction:function()
this.showToast("clickStartButtonNotifiction");
this.notification(0x1002);
,
//取消通知
clickCancelNotification:function()
this.showToast("clickCancelNotification");
this.notification(0x1003);
,
//初始化action
initAction: function (code)
var actionData = ;
actionData.notify = "this actionData form JS ";
var action = ;
action.bundleName = "com.chinasoft.example";
action.abilityName = "NotificationAbility";
action.messageCode = code;
action.data = actionData;
action.abilityType = 1;
action.syncOption = 0;
return action;
,
//调用PA
notification: async function(code)
try
var action = this.initAction(code);
var result = await FeatureAbility.callAbility(action);
console.info(" result = " + result);
this.showToast(result);
catch (pluginError)
console.error("startNotification : Plugin Error = " + pluginError);
,
2. 实现通知的逻辑
2.1 实现onRemoteRequest()方法
在工程中新建一个InternalAbility继承自AceInternalAbility,实现onRemoteRequest()方法
/*
* 当JS侧调用FeatureAbility.callAbility(OBJECT)接口时调用此方法,通过JS传来的指令执行对应的函数。
* */
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option)
String result = data.readString();
switch (code)
case 0x1001:
startTextNotification(reply);//文本类型的通知
break;
case 0x1002:
startPictureNotification(reply);//图片类型的通知
break;
case 0x1003:
cancelNotification(reply);//取消通知
break;
default:
reply.writeString("服务没有定义");//若是没有对应命令则回复
return false;
return true;
2.2 在MainAbility中注册与取消注册
@Override
public void onStart(Intent intent)
super.onStart(intent);
NotificationAbility.register(this);//当MainAbility创建的时候注册
@Override
public void onStop()
super.onStop();
NotificationAbility.deRegister();//当Ability销毁的时候注销
2.3 通知开发步骤
通知相关基础类包含NotificationSlot、NotificationRequest和NotificationHelper。
NotificationSlot可以对提示音、振动、重要级别等进行设置。一个应用可以创建一个或多个NotificationSlot,在发布通知时,通过绑定不同的NotificationSlot,实现不同用途。NotificationRequest用于设置具体的通知对象,包括设置通知的属性,如:通知的分发时间、小图标、大图标、自动删除等参数,以及设置具体的通知类型,如普通文本、长文本等。NotificationHelper封装了发布、更新、删除通知等静态方法。在这里主要通过介绍文本消息通知和图片消息通知。
2.3.1 定义通知类型并设置基本属性内容
设置文本通知的头部文本,通知标题,通知的内容。
//1.设置通知的类型以及设置通知的标题,正文等属性
NotificationRequest.NotificationNormalContent normalContent
= new NotificationRequest.NotificationNormalContent();
normalContent.setTitle("文本消息通知");//设置通知的标题
normalContent.setAdditionalText("头部文本");//设置通知的头部文本
normalContent.setText("这是一个文本消息通知");//设置通知的正文内容
设置图片通知的头部文本,通知标题,通知的简短介绍,通知图片。
pictureContent.setTitle("notifiction");
PixelMap pixelMap = getPixMap();
pictureContent.setBigPicture(pixelMap);//设置通知展示图片
pictureContent.setAdditionalText("这是一个图片通知");//设置通知的头部文本
pictureContent.setBriefText("对于通知的简介");//设置通知的简要介绍
2.3.2 定义通知的响应按钮
如果响应的按钮为文本则需要设置builder的第一个参数为null,若响应的按钮为图片则需要设置builder的第一个参数为PixelMap对象
//2.设置通知的响应按钮
IntentAgent intentAgent = setIntentAgent();
NotificationActionButton actionButton = new NotificationActionButton.Builder(null,
"回复", intentAgent)//设置回复按钮文本内容以及设置回复的action
.addNotificationUserInput(
new NotificationUserInput.Builder("QUICK_NOTIFICATION_REPLY")
.setTag("输入文本").build())//设置回复消息的tag
.setSemanticActionButton(NotificationConstant.SemanticActionButton.ARCHIVE_ACTION_BUTTON)
.setAutoCreatedReplies(false)
.build();
2.3.3 NotificationRequest设置
通过NotificationRequest对象对消息进行封装,设置通知内容,id以及回复按钮。
NotificationRequest.NotificationContent notificationContent = new NotificationRequest.NotificationContent(
normalContent);//将normalContent作为参数传给NotificationRequest对象
NotificationRequest notificationRequest = new NotificationRequest(100);//设置通知id
notificationRequest.setContent(notificationContent);//notificationRequest对象设置通知内容
notificationRequest.addActionButton(actionButton);//将回复动作按钮添加进notificationRequest
2.3.4 发布通知
(发布通知后手机状态栏会有通知信息显示)
通过调用NotificationHelper的publishNotification(NotificationRequest notificationRequest)
NotificationHelper.publishNotification(notificationRequest);
2.3.5 取消通知
(取消通知后通知会从手机状态栏消失)
通过调用NotificationHelper的cancelNotification(notification id)方法来实现,通过notificationid来辨别通知。
NotificationHelper.cancelNotification(100);
2.3.6 其他功能
若想对通知的提示音,振动,重要级别等进行设置,需要用到NotificationSlot对象,需要在发布前就对其进行设置。
其主要接口如下表。
接口名 | 描述 |
---|---|
NotificationSlot(String id, String name, int level) | 构造NotificationSlot。 |
setLevel(int level) | 设置NotificationSlot的级别。 |
setName(String name) | 设置NotificationSlot的命名。 |
setDescription(String description) | 设置NotificationSlot的描述信息。 |
enableBypassDnd(boolean bypassDnd) | 设置是否绕过系统的免打扰模式。 |
setEnableVibration(boolean vibration) | 设置收到通知时是否使能振动。 |
setEnableLight(boolean isLightEnabled) | 设置收到通知时是否开启呼吸灯,前提是当前硬件支持呼吸灯。 |
setLedLightColor(int color) | 设置收到通知时的呼吸灯颜色。 |
注意:这个对象只有在真机上才有真实效果。
总结
以上就是开发一个消息通知的完整过程,对于消息通知的应用是一个APP必不可少的部分,是APP与用户交互的一个通道。由于刚开始接触鸿蒙,还有许多表述不恰当的地方,请多指正!
更多原创内容请关注:中软国际 HarmonyOS 技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
#夏日挑战赛#harmonyos实现一个绘画板(代码片段)
本文正在参加星光计划3.0–夏日挑战赛前言本篇还是canvas内容,实现的是一个绘画板,本次绘画板的功能比较多一些,包括画笔颜色切换、清空、橡皮擦、保存、撤回、反撤回。可以用该绘画板来完成一些基础的绘画功能。介绍... 查看详情
#夏日挑战赛#harmonyos实现一个手绘板(代码片段)
本文正在参加星光计划3.0–夏日挑战赛前言最近在学习openHarmony,恰好之前了解过canvas,所以本篇文章分享一下我实现的一个手绘板,利用openHarmony内置的APIcnavas组件实现。介绍这是一个手绘板,并且可以根据滑动屏幕速度,动... 查看详情
#夏日挑战赛#harmonyos-实现带日期效果的待办事项(代码片段)
作者:俞才彬本文正在参加星光计划3.0–夏日挑战赛前言初学鸿蒙JS开发技术不久,想要快速结合官方文档上手鸿蒙JS组件开发,本文主要结合HarmonyOS官网上的相关组件及API实现一个根据日期持久化存储待办事项。效果演示实现... 查看详情
#夏日挑战赛#harmonyos-自定义组件之slider滑块(代码片段)
作者:范乐乐本文正在参加星光计划3.0–夏日挑战赛前言最近在学习HarmonyOS开发相关知识,在项目开发过程中有用到slider滑块组件,本文主要结合HarmonyOS官网上的相关组件以及通用API,实现一个slider滑块组件。效果演示实现原理... 查看详情
#夏日挑战赛#harmonyos-基于arkui(js)实现打地鼠游戏(代码片段)
作者:尹宝荣本文正在参加星光计划3.0–夏日挑战赛前言初学HarmonyOSArkUI(JS),对于FA的开发还是不太熟悉,单纯看文档,不使用起来的话,始终掌握不了,代码还是要多敲多思考才能进步。所以周末突发奇想利用HarmonyOS写了一个简... 查看详情
#夏日挑战赛#harmonyos-方舟开发框架arkui流光按钮效果(代码片段)
作者:汤志威本文正在参加星光计划3.0–夏日挑战赛前言最近看到很多按钮加边流动效果,今天我们用HarmonyOS来实现一下。实现效果对自定义的按钮添加动态样式,实现动态效果,并且通过这种实现的思路还可以更改div的样式,... 查看详情
#夏日挑战赛#harmonyos实现一个滑块验证(代码片段)
本文正在参加星光计划3.0–夏日挑战赛前言日常我们经常能见到验证码,网站上的验证码的作用是保护网站安全,一般网站都要通过验证码来防止机器大规模注册等危害。一般验证码有:图像验证、算数验证、滑动验证等。有些... 查看详情
#夏日挑战赛#带你玩转harmonyos多端钢琴演奏(代码片段)
本文正在参加星光计划3.0—夏日挑战赛前言想弹出悦耳的曲子奈何没有钢琴,代码来实现你的演奏愿望,软通动力程序小哥手把手带你编码造钢琴,用手机弹出你想要的曲子,多个手机同时演奏都不是问题。项目介绍本项目主要... 查看详情
#夏日挑战赛#harmonyoscanvas实现时钟(代码片段)
作者:郑瑶本文正在参加星光计划3.0–夏日挑战赛前言最近在学习HarmonyOS相关的东西,看了很多网上的canvas实现时钟,现在我也来写一个关于HarmonyOS的时钟吧。项目说明工具版本:DevEcoStudio3.0Beta3SDK版本;3.1.5.5主要用到知识:can... 查看详情
#夏日挑战赛#ffh分布式数据服务简单实现(openharmonyjsui)(代码片段)
本文正在参加星光计划3.0–夏日挑战赛@[TOC](#夏日挑战赛#【FFH】分布式数据服务简单实现(OpenHarmonyJSUI版))Demo效果展示先来看看我们要实现的demo的效果。点击同步数据的按钮后,A设备广播一段字符串到数据库中,然后B设备读... 查看详情
#夏日挑战赛#鸿蒙fa开发之jsui与javaui相互跳转实例(代码片段)
本文正在参加星光计划3.0–夏日挑战赛需求背景说明鸿蒙官方推荐使用Js或eTS方式来开发APP应用UI,但在开发过程中有可能会遇到JSUI无法实现的功能,例如地图导航、定制化视频播放器,那么这种场景下如何实现功能,这个需求... 查看详情
#夏日挑战赛#ffhharmonyos手机遥控dayu开发板相机(代码片段)
[本文正在参加星光计划3.0-夏日挑战赛]参数类型描述qualitystring图片质量:high,normal,lowsuccessFunction接口调用成功的回调函数failFunction接口调用失败的回调函数completeFunction接口调用结束的回调函数2.案例编写关于手机侧,开发板... 查看详情
#夏日挑战赛#ffh实时聊天室之websocket实战(代码片段)
本文正在参加星光计划3.0–夏日挑战赛@TOC前言如果要实现像微信聊天一样的功能,在组网内进行通信显然是不够的,所以软总线并不作用与这种远距离传输。如果我们要完成微信的聊天功能,传统的方法就是利用webSocket借助服... 查看详情
harmonyos之深入解析通知的使用(代码片段)
...知时必须包含一种样式。通知支持快捷回复。②应用场景HarmonyOS提供了通知功能,即在一个应用的UI界面之外显示的消息,主要用来提醒用户有来自该应用中的信息。当应用向系统发 查看详情
#夏日挑战赛#openharmony基于js实现的贪吃蛇(代码片段)
本文正在参加星光计划3.0–夏日挑战赛前言不知道干啥,那就敲代码吧,写个贪吃蛇,很显然,被自己菜哭了,自己写的贪吃蛇自己都不会玩(ps:我曾经可是在不会死亡的情况下完了好长时间>_<)实现效果如下::::hljs-center:::... 查看详情
#夏日挑战赛#用openharmonyets实现一个huaweiapp标准布局(代码片段)
...S实现一个Huaweiapp标准布局本文正在参加星光计划3.0--夏日挑战赛@TOC1.介绍Huawei的app,我们都能看得出来是用心设计过的,值得学习。如果我们仔细去看Huawei手机自带的app,我们会发现所有的app,无论是什么类型的app,其布局结构... 查看详情
木棉花#夏日挑战赛#鸿蒙小游戏项目——数独sudoku
「本文正在参加星光计划3.0--夏日挑战赛」前言 在上期的分享中,笔者详细介绍了如何利用代码布局创建网格区域的UI。而在这期的分享中,笔者将围绕网格区域增加相应的游戏功能。 上期的内容回顾——&g... 查看详情
#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~
本文正在参加星光计划3.0–夏日挑战赛数据库系统概论四个基本概念数据:数据库中存储的基本对象,描述一个事物的符号记录,数据和其语义不可分开说数据库(DB):是长期储存在计算机内、有组织的、可共享... 查看详情