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 实战系列总结

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

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


最后的话

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

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

相关推荐
SummerKaze1 天前
为鸿蒙开发者写一个 nvm:hmvm 的设计与实现
harmonyos
在人间耕耘3 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
王码码20353 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
HarmonyOS_SDK3 天前
【FAQ】HarmonyOS SDK 闭源开放能力 — Ads Kit
harmonyos
Swift社区3 天前
如何利用 ArkUI 框架优化鸿蒙应用的渲染性能
华为·harmonyos
特立独行的猫a3 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
盐焗西兰花3 天前
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
服务器·学习·harmonyos
盐焗西兰花3 天前
鸿蒙学习实战之路-STG系列(4/11)-应用选择页功能详解
服务器·学习·harmonyos
lbb 小魔仙3 天前
鸿蒙跨平台项目实战篇03:React Native Bundle增量更新详解
react native·react.js·harmonyos
特立独行的猫a3 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS滚动卡片组件,scroll-view无法滚动踩坑全记录
华为·uni-app·harmonyos·uniapp-x