在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

HarmonyOS 应用里,通知用于在系统通知栏展示消息、提醒用户;后台任务则用于在应用退到后台甚至部分场景下进程被挂起时,仍能完成拉取数据、上报等轻量工作。两者都涉及系统策略和权限,用不对容易「通知不弹出」或「后台任务被系统杀掉」。

本文只讲通知发布、通知渠道配置,以及后台任务(BackgroundTaskManager)的核心用法和注意点,不贴完整 Demo。

通知能力概述

通知由应用调用 @ohos.notificationManager 发布,由系统统一展示在通知栏、锁屏等。用户可在系统设置中按应用、按渠道管理通知开关,因此应用侧需要正确设置「渠道」和「重要性」,否则可能被系统折叠或静默。

发布简单文本通知

发布一条通知至少需要:通知 ID、渠道 ID、标题、内容。渠道 ID 需要先创建「通知渠道」,再在发布时引用。

创建通知渠道(建议在应用启动时执行一次):

import notificationManager from '@ohos.notificationManager'
import { BusinessError } from '@kit.BasicServicesKit'

const channelId = 'default_channel'
const channel: notificationManager.NotificationChannel = {
  id: channelId,
  name: '默认通知',
  importance: notificationManager.NotificationSlotLevel.DEFAULT,
  desc: '应用默认通知渠道',
  enableVibration: true,
  enableSound: true
}

notificationManager.addSlot(channel, (err: BusinessError) => {
  if (err) {
    console.error('addSlot failed', err)
  }
})

发布通知:

const notificationRequest: notificationManager.NotificationRequest = {
  id: 1,
  content: {
    notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {
      title: '标题',
      text: '通知内容正文'
    }
  },
  slotType: notificationManager.SlotType.CONTENT_INFORMATION,
  deliveryTime: new Date()
}

notificationManager.publish(notificationRequest, (err: BusinessError) => {
  if (err) {
    console.error('publish failed', err)
  }
})

要点:

  • id:应用内唯一,用于后续更新或取消同一条通知
  • slotType:与渠道重要性相关,如 CONTENT_INFORMATION、SOCIAL_COMMUNICATION 等,影响是否响铃、是否悬浮
  • channelId:若 API 支持在 content 或 request 上指定 channelId,应传入与 addSlot 时一致的 id,以便用户按渠道管理

取消与更新

按 id 取消单条通知:

notificationManager.cancel(1, (err: BusinessError) => {
  if (err) {
    console.error('cancel failed', err)
  }
})

更新同一条通知:用相同 id 再次调用 publish,传入新的 content 即可,适用于进度条、未读条数等场景。

权限与配置

  • 权限:发布通知通常需要申请 ohos.permission.NOTIFICATION_CONTROLLER 或应用级通知权限(以当前文档为准),在 module.json5 中声明,并在运行期弹窗申请。
  • 渠道:建议为「营销」「重要消息」等分设不同渠道,方便用户关闭不需要的一类,同时保证重要通知使用高重要性渠道。

后台任务

HarmonyOS 对后台运行限制较严,长时间后台执行需使用官方提供的「后台任务」能力,而不是自己起一个常驻线程。常见类型包括:短时任务(如上传、下载完成后立即结束)、长时任务(如播放音乐、导航时前台有持续提示)、延迟任务等。

短时任务(BackgroundMode)

应用退到后台后,若需争取一段短时间(通常几十秒级别)完成任务,可申请短时任务:

import backgroundTaskManager from '@ohos.resourceManager.backgroundTaskManager'

// 申请短时任务,并在回调里执行实际逻辑
backgroundTaskManager.startBackgroundRunning(
  getContext(this) as common.UIAbilityContext,
  backgroundTaskManager.BackgroundMode.DATA_TRANSFER,
  (err: BusinessError) => {
    if (err) {
      console.error('startBackgroundRunning failed', err)
      return
    }
    // 在此执行上传、同步等,完成后尽快调用 stopBackgroundRunning
    doSync().then(() => {
      backgroundTaskManager.stopBackgroundRunning(
        getContext(this) as common.UIAbilityContext,
        (e: BusinessError) => {
          if (e) {
            console.error('stopBackgroundRunning failed', e)
          }
        }
      )
    })
  }
)

要点:

  • BackgroundMode:如 DATA_TRANSFER、AUDIO_PLAYBACK 等,需与实际场景一致,并在 module.json5 中声明对应 backgroundModes,否则申请会失败。
  • 尽快结束:短时任务时间有限,任务完成后必须调用 stopBackgroundRunning,否则会影响续航并被系统限制。
  • 上下文getContext(this) 需在 Ability 或带 UI 的组件上下文中调用,保证拿到的是 UIAbilityContext。

长时任务(ContinuousTask)

需要长时间在后台运行(如音乐播放、导航)时,使用长时任务,并在前台展示持续通知,告知用户应用正在后台运行:

import continuousTaskManager from '@ohos.backgroundModeManager'

continuousTaskManager.startBackgroundRunning(
  getContext(this) as common.UIAbilityContext,
  continuousTaskManager.BackgroundMode.AUDIO_PLAYBACK,
  (err: BusinessError) => {
    if (err) {
      console.error('startBackgroundRunning failed', err)
      return
    }
    // 系统会展示持续通知,任务结束后需 stopBackgroundRunning
  }
)

长时任务同样需要在配置文件中声明对应 backgroundMode,且需符合场景(如音乐、导航),否则审核或运行期可能被拒绝。

延迟任务(WorkScheduler)

若只需「在某一段时间之后执行一次」,可用 WorkScheduler 注册延迟任务,由系统在合适时机唤醒执行,无需应用常驻后台:

import workScheduler from '@ohos.workScheduler'

const workInfo: workScheduler.WorkInfo = {
  bundleName: 'com.example.app',
  abilityName: 'EntryAbility',
  workId: 1,
  parameters: { key: 'value' }
}

workScheduler.startWork(workInfo, (err: BusinessError) => {
  if (err) {
    console.error('startWork failed', err)
  }
})

实际执行会在系统调度的延迟之后触发,具体 API(如延迟时间、条件)以当前版本文档为准。适用于「稍后同步」「定时提醒」等场景。

总结

  • 通知:先 addSlot 建渠道,再 publish 发通知;注意 id、channelId、slotType 和权限,便于用户管理和审核。
  • 后台任务:短时用 BackgroundMode 争取几十秒完成收尾;长时用 ContinuousTask 并配持续通知;定时/延迟用 WorkScheduler。所有后台能力都需在配置与场景上符合规范,并尽快结束短时任务。

合理使用通知与后台任务,既能提升体验,又不会因滥用被系统限制或影响续航。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐