#夏日挑战赛# HarmonyOS - 实现消息通知功能 原创 精华
作者:张明伟
前言
通知是手机软件的消息推送,一般需要设置通知的权限为允许通知才能在状态栏查看到通知。主要有以下使用场景:
-
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开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
通知功能基本每天都能用到,学习了。
get get