#夏日挑战赛#harmonyos-实现消息通知功能(代码片段)

开源基础软件社区官方 开源基础软件社区官方     2022-11-29     160

关键词:

作者:张明伟

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

前言

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

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

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

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

效果展示

实现步骤

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

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

51CTO 开源基础软件社区

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

#夏日挑战赛#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):是长期储存在计算机内、有组织的、可共享... 查看详情