HarmonyOS 通知与后台任务
摘要: 本文介绍了HarmonyOS应用开发中通知与后台任务的核心实现方法。通知发布需通过@ohos.notificationManager创建渠道并设置重要性,确保消息正常展示;后台任务分为短时任务(如数据传输)和长时任务(如音乐播放),需使用BackgroundTaskManager规范申请,并在完成后及时释放资源。重点包括:通知渠道配置、权限声明、任务模式选择及上下文管理,避免因系统策略导致

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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。所有后台能力都需在配置与场景上符合规范,并尽快结束短时任务。
合理使用通知与后台任务,既能提升体验,又不会因滥用被系统限制或影响续航。
更多推荐


所有评论(0)