HarmonyOS 推送通知开发实战:从权限申请到多场景应用的完整指南

摘要

在日常应用开发中,通知功能几乎是必不可少的。不管是聊天消息、系统提醒,还是任务进度更新,都需要通过通知来触达用户。对于开发者来说,如何在鸿蒙(HarmonyOS)应用中实现推送通知,是一个绕不开的问题。本文将带你从基础配置到实战代码,再到实际场景应用,完整地走一遍流程。

引言

目前的移动应用几乎都离不开通知:微信的消息提醒、支付宝的到账提醒、外卖平台的派送提醒......这些都是通知系统在背后支撑的。

在鸿蒙系统里,通知的实现主要依赖 通知服务(Notification Service)。它既支持本地通知(应用自己发出,比如闹钟提醒),也支持远程推送(服务端通过 Push 下发,比如系统更新提醒)。

接下来,我们会先走一遍最基础的流程:申请权限、构建通知、发送通知。之后再通过实际场景来看看通知功能是怎么用到真实应用里的。

鸿蒙通知开发全流程

申请权限

要想在鸿蒙里发送通知,必须先申请权限。在 module.json5 里声明:

json 复制代码
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.NOTIFICATION_CONTROLLER"
      }
    ]
  }
}

这一行配置就相当于告诉系统:"我的应用需要发通知"。如果你忘记写,应用运行时是没有权限发通知的。

构建通知并发送

通知分两部分:一个是 通知渠道(NotificationSlot) ,另一个是 通知内容(NotificationRequest)

下面是一个最基础的 ArkTS 示例:

ts 复制代码
import notificationManager from '@ohos.notificationManager';

async function sendNotification() {
  // 1. 创建通知渠道(通常在应用启动时配置一次)
  let slot: notificationManager.NotificationSlot = {
    type: notificationManager.SlotType.SOCIAL_COMMUNICATION,
    id: "default_slot",
    name: "消息通知"
  };
  await notificationManager.addSlot(slot);

  // 2. 构建通知内容
  let notificationRequest: notificationManager.NotificationRequest = {
    id: 1,
    slotId: "default_slot",
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
      normal: {
        title: "鸿蒙推送通知",
        text: "这是一条测试通知"
      }
    }
  };

  // 3. 发送通知
  await notificationManager.publish(notificationRequest);
}

如果你把这段代码放到按钮点击事件里,就能直接在真机上跑起来,通知会显示在系统通知栏。

三个典型应用场景

本地提醒(比如闹钟/待办事项)

有时候应用需要在特定时间提醒用户,比如闹钟响起、待办任务到期。这时候就可以结合定时器和本地通知。

ts 复制代码
import common from '@ohos.app.ability.common';

function scheduleLocalNotification() {
  let context = getContext(this) as common.UIAbilityContext;

  setTimeout(async () => {
    await sendNotification(); // 调用前面写的 sendNotification()
  }, 5000); // 5 秒后触发
}

这样,当用户设置了一个待办提醒,你就可以在指定的时间触发本地通知。

聊天消息(即时通讯场景)

在聊天类应用里,最常见的就是"新消息提醒"。通常服务端会通过 远程推送(Push Kit 或三方推送服务) 把消息推送到用户设备,客户端收到消息后,再通过通知栏提醒用户。

伪代码大概是这样的:

ts 复制代码
// 收到服务器下发的推送消息
async function onPushMessageReceived(message: any) {
  let notificationRequest: notificationManager.NotificationRequest = {
    id: Date.now(), // 用时间戳避免重复
    slotId: "default_slot",
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
      normal: {
        title: "新消息",
        text: message.text
      }
    }
  };
  await notificationManager.publish(notificationRequest);
}

这样就能在系统通知栏里展示聊天消息,用户点击后可以直接进入对应的聊天界面。

系统级提醒(比如更新/后台任务完成)

有些时候应用需要在后台提醒用户,比如"下载完成"、"系统更新"。这类通知一般不会频繁触发,但对用户体验很重要。

ts 复制代码
async function showUpdateNotification() {
  let notificationRequest: notificationManager.NotificationRequest = {
    id: 99,
    slotId: "default_slot",
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
      normal: {
        title: "系统更新",
        text: "新版本已下载完成,点击安装"
      }
    }
  };
  await notificationManager.publish(notificationRequest);
}

这里的关键是:即便应用退到后台,通知依然能触发,让用户不会错过重要消息。

QA 环节

Q1:通知和弹窗有什么区别?

通知是系统层面的,用户可以在通知栏集中查看,适合长期提醒;而弹窗(Dialog/Toast)通常是临时展示的,用户关掉就没了。

Q2:通知能否带动作?

可以。通知支持设置点击事件,用户点击后可以打开应用的特定页面(比如跳到聊天详情页)。

Q3:远程推送和本地通知有什么关系?

远程推送只是消息来源的一种,本地通知是最终展示的方式。一般流程是:服务端推送消息 → 客户端接收 → 调用本地通知 API 展示。

总结

在鸿蒙应用开发中,推送通知是一个很常见的功能点。它的实现流程其实并不复杂,分成三步就能搞定:

module.json5 里申请权限。

定义通知渠道和通知内容。

调用 notificationManager.publish 发送通知。

同时,不同的场景下,通知的使用方式也有所区别:闹钟提醒用定时+本地通知,聊天消息用远程推送+本地通知,系统更新用后台任务+本地通知。

只要你掌握了基础用法,就可以很容易扩展到各种业务场景中。

相关推荐
zhanshuo3 小时前
鸿蒙 ArkTS 自定义组件全攻略:从按钮到商品卡片一步步搞定
harmonyos
奶糖不太甜11 小时前
鸿蒙开发组件问题:方法论与技术探索
harmonyos
鸿蒙小灰11 小时前
鸿蒙开发问题之网络请求库适配
网络协议·harmonyos
HarmonyOS_SDK15 小时前
汽车之家联合HarmonyOS SDK,深度构建鸿蒙生态体系
harmonyos
whysqwhw15 小时前
鸿蒙沉浸式
harmonyos
whysqwhw16 小时前
鸿蒙Stack使用
harmonyos
whysqwhw16 小时前
鸿蒙Flex使用
harmonyos
whysqwhw17 小时前
鸿蒙Row/Column使用
harmonyos