当前位置:网站首页>#夏日挑战赛# HarmonyOS - 实现消息通知功能

#夏日挑战赛# HarmonyOS - 实现消息通知功能

2022-07-05 18:44:00 51CTO

作者:张明伟

 本文正在参加星光计划3.0–夏日挑战赛

前言

通知是手机软件的消息推送,一般需要设置通知的权限为允许通知才能在状态栏查看到通知。主要有以下使用场景:

  1. app内的通知:如微信新消息的提醒,以及一些APP广告的推送,APP版本更新;

  2. 系统的通知,如电量过低,短信提醒等;

  3. 显示正在进行的事件,如音乐播放,下载等都是通知。

效果展示

#夏日挑战赛# HarmonyOS - 实现消息通知功能_通知消息

实现步骤

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.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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);
        }
    },
}

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

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;
    }

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

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销毁的时候注销
    }

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

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("这是一个文本消息通知");//设置通知的正文内容
 

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

设置图片通知的头部文本,通知标题,通知的简短介绍,通知图片。

  pictureContent.setTitle("notifiction");
  PixelMap pixelMap = getPixMap();
  pictureContent.setBigPicture(pixelMap);//设置通知展示图片
  pictureContent.setAdditionalText("这是一个图片通知");//设置通知的头部文本
  pictureContent.setBriefText("对于通知的简介");//设置通知的简要介绍

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
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();

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
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

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
2.3.4 发布通知

(发布通知后手机状态栏会有通知信息显示)

通过调用NotificationHelper的publishNotification(NotificationRequest notificationRequest)

            NotificationHelper.publishNotification(notificationRequest);

     
  • 1.
2.3.5 取消通知

(取消通知后通知会从手机状态栏消失)

通过调用NotificationHelper的cancelNotification(notification id)方法来实现,通过notificationid来辨别通知。

            NotificationHelper.cancelNotification(100);

     
  • 1.
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开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

 想了解更多关于开源的内容,请访问:

 51CTO 开源基础软件社区

 https://ost.51cto.com/#bkwz

原网站

版权声明
本文为[51CTO]所创,转载请带上原文链接,感谢
https://blog.51cto.com/harmonyos/5444207