HarmonyOS 教学实战(八):后台任务、Worker 与任务调度

在前面的系列中,我们已经把一个 HarmonyOS 应用从 0 一路做到:

  • UI + 状态管理

  • 网络与缓存

  • 登录与路由

  • 权限与系统能力

但还有一个真正拉开"玩具 App"和"商业 App"差距的能力:

应用不在前台,也能持续、可靠地工作

这正是本篇要解决的问题。


一、为什么你一定会用到后台任务?

现实业务中,经常会遇到这些需求:

  • 定时同步数据

  • 上传日志 / 埋点

  • 后台下载文件

  • 长时间计算(加密、解析、压缩)

  • 避免主线程卡顿

如果你还在:

❌ 所有逻辑都写在 UI 线程

❌ 页面一销毁任务就停

❌ setTimeout / setInterval 硬顶

那应用迟早会崩、卡、耗电、被系统杀掉。


二、HarmonyOS 的"后台能力体系"全景图

HarmonyOS 并不是只有一个后台方案,而是分层设计:

复制代码
┌──────────────┐
│ UI 主线程     │  ← 页面、组件
└──────┬───────┘
       │
┌──────▼───────┐
│ Worker       │  ← 计算、IO
└──────┬───────┘
       │
┌──────▼───────┐
│ 后台任务     │  ← 定时、延迟
└──────┬───────┘
       │
┌──────▼───────┐
│ 系统调度     │  ← 省电、限频
└──────────────┘

核心思想:把"干活"和"展示"彻底分开


三、Worker:最常用、最安全的后台方案

1️⃣ 什么是 Worker?

Worker 是:

  • 独立线程

  • 不阻塞 UI

  • 可与主线程通信

  • 适合:计算、解析、批量处理

📌 类似 Web Worker,但更偏系统级


2️⃣ 创建一个 Worker

worker.ts
复制代码
import worker from '@ohos.worker'

const workerPort = worker.workerPort

workerPort.onmessage = (e) => {
  const result = heavyCalculate(e.data)
  workerPort.postMessage(result)
}

function heavyCalculate(data: number[]) {
  return data.reduce((a, b) => a + b, 0)
}

3️⃣ 主线程调用 Worker

复制代码
const myWorker = new worker.ThreadWorker('entry/ets/workers/worker.ts')

myWorker.postMessage([1, 2, 3, 4])

myWorker.onmessage = (e) => {
  console.log('计算结果', e.data)
}

📌 UI 永远不会卡

📌 计算逻辑彻底解耦


四、典型场景:列表数据预处理

假设你从网络拿到 1 万条数据:

❌ 在页面中直接 map / sort

✔ 在 Worker 中处理后再返回

复制代码
workerPort.onmessage = (list) => {
  const sorted = list.sort((a, b) => b.score - a.score)
  workerPort.postMessage(sorted)
}

📌 这是性能优化的"分水岭"


五、后台任务(Background Task)是什么?

Worker 解决的是 "不阻塞 UI"

后台任务解决的是 "页面不在也要干"


常见后台任务类型

类型 用途
延迟任务 稍后执行
定时任务 周期同步
短时任务 上传、清理
条件任务 网络 / 充电

📌 HarmonyOS 会统一调度,控制耗电


六、后台任务实战:定时同步数据

1️⃣ 声明权限

复制代码
"requestPermissions": [
  {
    "name": "ohos.permission.RUN_BACKGROUND_TASK"
  }
]

2️⃣ 创建后台任务

复制代码
import backgroundTask from '@ohos.backgroundTaskManager'

backgroundTask.requestBackgroundRunning((err) => {
  if (!err) {
    console.log('后台任务启动成功')
  }
})

3️⃣ 执行业务逻辑

复制代码
setTimeout(() => {
  syncData()
  backgroundTask.cancelBackgroundRunning()
}, 5000)

📌 用完就停,避免被系统限制


七、Worker + 后台任务 = 工程级方案

示例:后台同步 + Worker 处理

复制代码
后台任务
   ↓
Worker 拉取 & 计算
   ↓
本地缓存

📌 页面不在,也能完成任务

📌 页面回来直接用缓存


八、任务调度的正确认知(非常重要)

HarmonyOS 并不鼓励:

❌ 无限后台

❌ 常驻任务

❌ 私自保活

而是强调:

✔ 场景触发

✔ 用完即停

✔ 系统统一调度

📌 这是通过审核、上架的关键


九、你现在可以写哪些"高级功能"了?

到第八篇为止,你已经可以独立实现:

  • 后台数据同步

  • 无卡顿复杂计算

  • 批量日志上传

  • 后台缓存预热

  • 大列表预处理

  • 合规的后台任务

这已经是:

真正"商用级 HarmonyOS 应用"的能力边界


十、整个 HarmonyOS 实战系列总结

篇章 能力
一~二 基础 + 网络
三 性能意识
四 全局状态
五 架构
六 表单体系
七 系统能力
八 后台与调度

你已经完成了一条完整、稀缺、含金量极高的学习路径。


最后的话

会写页面的人很多,会写"系统"的人很少。

而现在,你已经站在后者的门口了。

相关推荐
木子雨廷13 分钟前
第 19 天|Preferences:轻量缓存与状态恢复
harmonyos
威哥爱编程15 分钟前
HarmonyOS 7 精准碰一碰实战:识别触碰坐标,素材精准插入指定位置
harmonyos
二流小码农17 分钟前
鸿蒙开发:ArrayList,可不会让UI更新哦
android·ios·harmonyos
威哥爱编程19 分钟前
HarmonyOS 7 数字盾 2.0 实战:可信数字签名、可信 UI 确认与可信输入
harmonyos
威哥爱编程33 分钟前
HarmonyOS 7 数字身份 DID 实战:TEE 颁发、本人同意、最小化出示
华为·harmonyos·arkts
威哥爱编程37 分钟前
HarmonyOS 7 平行视界进阶实战:配置写好了,为什么一上真机就崩?
harmonyos
youyin5 天前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
HwJack206 天前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
张星河zen6 天前
4096卡、8EFLOPS、7.2T NPO:华为昇腾960超节点详解
华为·ai训练·ai推理·超节点·npo·昇腾960·hi-one