HarmonyOS鸿蒙Next通知实践

HarmonyOS鸿蒙Next通知实践

背景

HarmonyOS 论坛中有研发人员求助,反馈通知没有没有声音,因此在真机上验证了一下,果不其然,没有通知的提示音,后来解决办法也非常简单,在手机设置应用中,将可以打开的通知提示统统改为铃声。

问题是解决了,但有必要分享一下HarmonyOS中的通知问题

实践总结

  1. slotType的设置,一定要放在 NotificationRequest 结构体中,使用NotificationManager.addSlot 这个函数是不起作用的
  2. NOTIFICATION_CONTENT_PICTURE 这个类型的通知,并不会展示图片
  3. NOTIFICATION_CONTENT_CONVERSATION 这个类型其实是不支持的
  4. 官方指导 图片类型 通知样例参数在 HarmonyOS SDK API 9上边使用错误

错误参数:pixelFormat:“ARGB_8888”

更正:pixelFormat: image.PixelMapFormat.RGBA_8888, 即 枚举类型

准备条件

  1. HarmonyOS 4.0
  2. HarmonyOS SDK API 9

实践功能介绍

备注: 参照 官网指导

  1. NOTIFICATION_CONTENT_BASIC_TEXT(普通文本类型)
  2. NOTIFICATION_CONTENT_LONG_TEXT (长文本类型)
  3. NOTIFICATION_CONTENT_MULTILINE (多行文本类型)
  4. NOTIFICATION_CONTENT_PICTURE (图片类型)
  5. NOTIFICATION_CONTENT_CONVERSATION (会话类型)
  6. 进度条类型 (个人观点:这个不是一个类型,仅仅是基于基础通知类型从而实现的一个功能)

注意: NOTIFICATION_CONTENT_CONVERSATION 在SDK中出现了,官方指导中没有说明

样式说明

NOTIFICATION_CONTENT_BASIC_TEXT(普通文本类型)

NOTIFICATION_CONTENT_LONG_TEXT (长文本类型)

NOTIFICATION_CONTENT_MULTILINE (多行文本类型)

NOTIFICATION_CONTENT_PICTURE (图片类型)

进度条通知

SlotType

这个属性功能真正使用时间,是今天才开始。

这个属性功能,根据官方指导,有两种设置方式

第一种

let notificationRequest = {
   id: 1, //可以按照自己应用实际的情况,生成其它数字
   slotType: NotificationManager.SlotType.SOCIAL_COMMUNICATION //可以选择其它类型
}

NotificationManager.publish(notificationRequest)

第二种

let notificationRequest = {
  ......
}

function addSlotCallBack(err) {
  if (err) {
    console.info("addSlot failed " + JSON.stringify(err));
  } else {
    console.info("addSlot success");
  }
}
NotificationManager.addSlot(NotificationManager.SlotType.SOCIAL_COMMUNICATION, addSlotCallBack);

NotificationManager.publish(notificationRequest)

其中第2种方式,实际是不生效的,虽然可以在控制台看到日志输出

SlotType 具体功能现象

根据第1种实现方式,如果没有slotType这个字段,默认值其实是其它类型,在代码层面没有表现出来,但是通过用户设置交互层面,可以看到表象

场景设定

“普通文本”, “长文本”, “多行类型” 统一指定slotType为NotificationManager.SlotType.SOCIAL_COMMUNICATION

“带图片类型” 不设置slotType

真机场景查看

设置 -> 通知和状态栏 -> 选择自己的应用(实践应用:HarmonyLearn)-> 找一下有没有类别项,如果没有,可以根据本实践主页面进一下相关操作

实践主页样式

Screenshot_20240110231925234.png

验证过程

  1. 点击“带图片类型”, 按照“真机场景查看” 的步骤操作,应该可以看到 “类别” 菜单了,但子菜单只有一个 “社交通讯”

Screenshot_20240110212600964.png

  1. 点击"普通文本" / “长文本” / “多行类型”, 按照“真机场景查看” 的步骤操作,应该可以看到 “类别” 菜单中出现了一个“其他”子菜单

Screenshot_20240110211624413.png

铃声行为设定

通过“验证过程”,已可以了解到,如果要设置通知铃声,可以进入“社交通讯” & 其它 里边去详细设置

Screenshot_20240110212856214.png
Screenshot_20240110211933266.png

横幅样式

在阅读官方指导过程中,“横幅通知” 这个词应该见到过,它的具体表现是什么样子呢?

效果图

Screenshot_20240110212832714.png

如何设置

设置 -> 通知和状态栏 -> 选择自己的应用(实践应用:HarmonyLearn -> 提醒方式 -> “横幅通知”

Screenshot_20240110212856214.png

13 回复

module.json5



```json
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.READ_MEDIA"
      },
      {
        "name": "ohos.permission.WRITE_MEDIA"
      },
      {
        "name": "ohos.permission.MEDIA_LOCATION"
      },
      {
        "name": "ohos.permission.LOCATION"
      },
      {
        "name": "ohos.permission.APPROXIMATELY_LOCATION"
      }
    ],
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ts",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:icon",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      }
    ]
  }
}

app.json5



```json
{
  "app": {
    "bundleName": "com.example.medicaltreatment",
    "vendor": "example",
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name"
  }
}

更多关于HarmonyOS鸿蒙Next通知实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


项目名称

  • 项目状态: 激活
  • 创建日期: 2022-01-01
  • 最后更新: 2022-02-01
  • 版本: v1.0.0

描述

这是一段描述信息。这里可以包含多行文本,用于详细介绍项目。

成员

  • 成员一
  • 成员二
  • 成员三

标签

  • 标签一
  • 标签二
  • 标签三
- [pages/Index](pages/Index)
- [pages/Login](pages/Login)
- [pages/Home](pages/Home)
- [pages/ConsultationOrder/ConsultationOrderIndex](pages/ConsultationOrder/ConsultationOrderIndex)
- [pages/AccountSetting/UserSettingIndex](pages/AccountSetting/UserSettingIndex)
- [pages/EquipmentBack/Index](pages/EquipmentBack/Index)
- [pages/AddressManagement/AddressManagementIndex](pages/AddressManagement/AddressManagementIndex)
- [pages/AddressManagement/AddAddress](pages/AddressManagement/AddAddress)
- [pages/AccountSetting/AccountUserSettingIndex](pages/AccountSetting/AccountUserSettingIndex)
- [pages/TestPage/TestPageIndex](pages/TestPage/TestPageIndex)

真机已验证你的代码可以打开目标页,

![cke_229.png](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/031/531/091/0070086000031531091.20240112153507.02478265486842263080404449056325:50001231000000:2800:0B3F382C427C951050B70C11AF5D2AAA6EC2E0FE83929E17C8FED4047619083C.png)

![cke_426.png](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/031/531/091/0070086000031531091.20240112153519.55116450109178155591598781545644:50001231000000:2800:754E03429F81C111E00DB1A9D476B97C2CE9769D7BE71B6E19F9E513F8C363F8.png)

项目名称

  • 项目描述: 这是一个示例项目,用于展示如何将HTML内容转换为Markdown。

基本信息

  • 创建者: 张三
  • 最后更新时间: 2023-10-01

项目亮点

  • 简洁明了的设计
  • 高度可定制的功能
  • 优秀的社区支持

项目名称

项目描述

这是一段描述。

基本信息

  • 作者: 张三
  • 版本: 1.0.0
  • 许可证: MIT

功能

  • 功能一
  • 功能二
  • 功能三

联系方式

您好:我发现按照您的代码 我点击通知栏 并没有触发onCreate里面的代码

下图是点击通知栏之后的日志

![cke_1651.png](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/031/531/091/0070086000031531091.20240112145816.34356862488341947735133642337011:50001231000000:2800:940EC3771870F692DD6687C7EE0BB924D17E84BFB9576D8618142393D01FFA80.png)

![cke_3772.png](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/031/531/091/0070086000031531091.20240112145856.87944068458718497853747609354619:50001231000000:2800:57DE8E7A232220966FFA9B1E8EB8CEF50F7756E68DBF24219159BC8D0A5EB7EB.png)

第一次启动的时候有输出信息 但是点击通知栏就没有日志了 并且onCreateonWindowStageCreate都没有输出信息

项目名称

  • 项目状态: 激活
  • 创建时间: 2020-03-10
  • 最后更新: 2020-03-10
  • 负责人: 张三
  • 团队成员: 李四, 王五

项目描述

这是一段关于项目的描述。项目的主要目标是开发一个全新的软件系统,以提高工作效率并减少错误。

目标

  • 提高工作效率
  • 减少错误
  • 增强用户体验

功能

  • 用户管理
  • 数据分析
  • 报表生成
TO 133******54

### 1. 页面打开前的设置
```javascript
let wantInfo: wantAgent.WantAgentInfo = {
      wants: [
        {
          bundleName: 'com.example.medicaltreatment',
          abilityName: 'EntryAbility',
          moduleName: 'entry',
          parameters: {
              //自定义对象appRouter
              appRouter: { 
                   'pagePath': 'pages/Home'
              }
          }
        }
      ],
      requestCode: 0,
      operationType: wantAgent.OperationType.START_ABILITY,
      wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG]
    }
    // 创建wantInfo的实例
    this.wantAgentInstance = await wantAgent.getWantAgent(wantInfo)

2. 在EntryAbility中解析参数

export default class EntryAbility extends UIAbility {
  public extParams: Object

  onCreate(want, launchParam) {
    //1. 提取Want参数字段
    this.extParams = want.parameters

    console.log(JSON.stringify(this.extParams))
  }

  onWindowStageCreate(windowStage: window.WindowStage) {

    //2. 开始解析参数
    let pagePath: string = ''
    if(this.extParams['appRouter']){
       pagePath = this.extParams['appRouter']['pagePath']
    }

    if(pagePath == undefined || pagePath.trim().length == 0){
      //3. 无路径,直接关闭当前窗体
      this.context.terminateSelf()
      return
    }

    //4. 加载外部传入的路径
    windowStage.loadContent(pagePath, (err, data) => {
      if (err.code) {
        return;
      }
    });

  }

}
您好 请问通知跳转到某一个页面怎么写: 比如我点击了通知 要跳转到pages/Home这个页面

```javascript
let wantInfo: wantAgent.WantAgentInfo = {
  wants: [
    {
      bundleName: 'com.example.medicaltreatment',
      abilityName: 'EntryAbility',
      moduleName: 'entry',
      uri: 'pages/Home'
    }
  ],
  requestCode: 0,
  operationType: wantAgent.OperationType.START_ABILITY,
  wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG]
}
// 创建wantInfo的实例
this.wantAgentInstance = await wantAgent.getWantAgent(wantInfo)

wants里面的uri我以为是跳转的路径 结果发现并不是,那请问是哪个参数控制的呢

TO133******54

在HarmonyOS鸿蒙Next中,通知实践主要涉及通知的创建、管理和显示。开发者可以使用NotificationManagerNotificationChannel类来创建和管理通知。首先,通过NotificationChannel设置通知渠道,定义通知的重要性和行为。然后,使用NotificationManager发送通知,设置标题、内容、图标等。鸿蒙Next支持丰富的通知样式,如大文本、图片等,提升用户体验。此外,开发者还可以处理通知点击事件,实现跳转或执行特定操作。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!