HarmonyOS应用开发实战:猫猫大作战-workScheduler 的使用
前言workScheduler工作调度器是 BackgroundTasksKit 中用于执行延迟/周期任务的能力。与startBackgroundRunning的持续运行不同workScheduler 适合定时触发的短任务——如每日战绩上传、每周排行榜刷新、缓存清理等。在「猫猫大作战」中我们使用 workScheduler 实现每日定时上传战绩到云端确保玩家的高分不会丢失同时为未来的跨设备同步打下基础。本文以「猫猫大作战」的定时战绩上传为锚点讲解 workScheduler 的完整使用方法包括WorkInfo 配置、任务注册和取消、WorkAbility 实现、以及约束条件设置。提示本系列不讲 ArkTS 基础语法与环境搭建。本篇是阶段五第 163 篇。一、workScheduler 基础1.1 WorkInfo 配置import { workScheduler } from kit.BackgroundTasksKit; async function scheduleSync(context: Context): Promisevoid { const workInfo: workScheduler.WorkInfo { workId: 1001, // 任务唯一 ID bundleName: com.maomaodazuozhan.game, // 包名 abilityName: SyncWorkAbility, // 执行任务的 Ability networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI, // 网络条件 isPersisted: true, // 重启后是否保留 repeatCycleTime: 24 * 60 * 60 * 1000, // 24 小时周期 }; try { await workScheduler.startWork(workInfo); console.info(工作调度器已启动, workId: ${workInfo.workId}); } catch (err) { console.error(启动工作调度失败: ${err.message}); } }1.2 参数详解参数类型必填说明workIdnumber✅任务唯一标识同一应用内不可重复bundleNamestring✅应用包名与应用配置一致abilityNamestring✅执行后台任务的 Ability 类名networkTypeNetworkType❌网络条件约束WIFI/移动数据/不限isPersistedboolean❌设备重启后是否保留该任务repeatCycleTimenumber❌循环周期毫秒不设为单次任务提示workId在同一个应用中必须唯一。建议用递增数字管理或使用模块编号如 1001战绩上传、1002排行榜刷新。二、WorkAbility 实现2.1 创建 WorkAbility// entry/src/main/ets/entryability/SyncWorkAbility.ets import { WorkSchedulerAbility, workScheduler } from kit.BackgroundTasksKit; import { hilog } from kit.PerformanceAnalysisKit; export default class SyncWorkAbility extends WorkSchedulerAbility { private TAG SyncWork; private DOMAIN 0xFF00; onWorkStart(workInfo: workScheduler.WorkInfo): void { hilog.info(this.DOMAIN, this.TAG, 后台任务启动: workId${workInfo.workId}); // 执行具体的后台任务 this.executeSyncTask().then(() { hilog.info(this.DOMAIN, this.TAG, 后台任务执行完成); }).catch((err) { hilog.error(this.DOMAIN, this.TAG, 后台任务失败: ${err.message}); }); } onWorkStop(workInfo: workScheduler.WorkInfo): void { hilog.info(this.DOMAIN, this.TAG, 后台任务停止: workId${workInfo.workId}); // 清理资源 } private async executeSyncTask(): Promisevoid { // 1. 读取本地战绩 const localData await this.readLocalScores(); // 2. 上传到服务端 await this.uploadToCloud(localData); // 3. 清理过期缓存 await this.cleanCache(); } private async readLocalScores(): Promiseobject { // 从 RDB 或 Preferences 读取 return { /* ... */ }; } private async uploadToCloud(data: object): Promisevoid { // 调用网络 API 上传 hilog.info(this.DOMAIN, this.TAG, 上传战绩数据); } private async cleanCache(): Promisevoid { // 清理 7 天前的缓存 hilog.info(this.DOMAIN, this.TAG, 清理缓存); } }2.2 module.json5 注册{ module: { abilities: [ { name: SyncWorkAbility, srcEntry: ./ets/entryability/SyncWorkAbility.ets, description: $string:SyncWorkAbility_desc, icon: $media:icon, label: $string:SyncWorkAbility_label, type: workScheduler, exported: false, }, // ... ], } }三、任务注册和管理3.1 启动任务export class SyncManager { // 每日战绩上传任务 static readonly SYNC_WORK_ID 1001; // 每日排行榜刷新任务 static readonly RANK_WORK_ID 1002; static async startDailySync(context: Context): Promisevoid { const workInfo: workScheduler.WorkInfo { workId: this.SYNC_WORK_ID, bundleName: context.abilityInfo.bundleName, abilityName: SyncWorkAbility, networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI, isPersisted: true, repeatCycleTime: 24 * 60 * 60 * 1000, // 24h }; await workScheduler.startWork(workInfo); } static async startWeeklyRank(context: Context): Promisevoid { const workInfo: workScheduler.WorkInfo { workId: this.RANK_WORK_ID, bundleName: context.abilityInfo.bundleName, abilityName: SyncWorkAbility, // 可复用相同的 Ability networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI, isPersisted: true, repeatCycleTime: 7 * 24 * 60 * 60 * 1000, // 7d }; await workScheduler.startWork(workInfo); } }3.2 停止和查询任务// 停止单个任务 async function stopSyncWork(context: Context): Promisevoid { try { await workScheduler.stopWork( context, SyncManager.SYNC_WORK_ID, true // true 取消已等待但未执行的任务 ); console.info(定时同步已停止); } catch (err) { console.error(停止任务失败: ${err.message}); } } // 查询任务状态 async function isWorkScheduled(workId: number): Promiseboolean { try { const isScheduled await workScheduler.isWorkScheduled(workId); console.info(任务 ${workId}: ${isScheduled ? 已调度 : 未调度}); return isScheduled; } catch (err) { console.error(查询任务状态失败: ${err.message}); return false; } } // 获得所有已调度的任务 async function getAllScheduledWorks(context: Context): PromiseworkScheduler.WorkInfo[] { return await workScheduler.getAllScheduledWorks(context); }3.3 约束条件// 网络类型约束 enum NetworkType { NETWORK_TYPE_ANY, // 不限WIFI 或移动数据 NETWORK_TYPE_MOBILE, // 仅移动数据 NETWORK_TYPE_WIFI, // 仅 WIFI推荐 } // 其他约束可通过 WorkInfo 设置 interface WorkInfo { // ... batteryLevel?: number; // 电量阈值如 20% 以上才执行 isCharging?: boolean; // 是否仅充电时执行 storageLevel?: number; // 存储空间阈值 }约束类型说明推荐值networkTypeNetworkType网络条件WIFI节省流量batteryLevelnumber最低电量百分比20isChargingboolean是否需充电状态falsestorageLevelnumber最低存储百分比10四、性能与节电4.1 任务执行限制// workScheduler 任务的限制 // 1. 每次执行最长 2 分钟超时自动停止 // 2. 单应用每日总执行时长有限制 // 3. 频率不宜过高建议 ≥ 1 小时 // ✅ 推荐的周期任务间隔 const RECOMMENDED_INTERVALS { HOURLY: 60 * 60 * 1000, // 1 小时 DAILY: 24 * 60 * 60 * 1000, // 24 小时推荐 WEEKLY: 7 * 24 * 60 * 60 * 1000, // 7 天 };4.2 省电策略// 省电建议 // 1. WIFI 下执行避免消耗移动数据 networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI, // 2. 仅充电时执行适合大数据量同步 const workInfo: workScheduler.WorkInfo { // ... isCharging: true, }; // 3. 合并多个任务到同一个 WorkAbility // 避免启动多个独立的后台任务用一个 Ability 处理多个操作 export default class UnifiedWorkAbility extends WorkSchedulerAbility { onWorkStart(workInfo: workScheduler.WorkInfo): void { switch (workInfo.workId) { case 1001: this.syncScores(); break; case 1002: this.refreshRank(); break; case 1003: this.cleanCache(); break; } } }五、常见场景5.1 每日签到提醒async function scheduleDailyReminder(context: Context): Promisevoid { const workInfo: workScheduler.WorkInfo { workId: 2001, bundleName: context.abilityInfo.bundleName, abilityName: ReminderWorkAbility, isPersisted: true, repeatCycleTime: 24 * 60 * 60 * 1000, }; await workScheduler.startWork(workInfo); }5.2 战绩云同步// 游戏结束时触发一次同步非周期任务 async function syncAfterGame(context: Context, score: number): Promisevoid { // 立即同步一次 const workInfo: workScheduler.WorkInfo { workId: 3001, bundleName: context.abilityInfo.bundleName, abilityName: SyncWorkAbility, networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI, // 不设 repeatCycleTime → 单次任务 }; await workScheduler.startWork(workInfo); }六、调试方法// 使用 hdc 命令调试 workScheduler // hdc shell // hdc shell aa start -b com.maomaodazuozhan.game -a SyncWorkAbility // 查看已调度的任务 async function debugScheduledWorks(context: Context): Promisevoid { const works await workScheduler.getAllScheduledWorks(context); console.info(当前已调度 ${works.length} 个后台任务:); for (const w of works) { console.info( workId${w.workId}, ability${w.abilityName}, repeat${w.repeatCycleTime}ms, persisted${w.isPersisted}); } }七、常见问题问题原因解决任务未按时执行系统省电限制使用isPersistedtrue并设置合理触发条件WorkAbility 未启动module.json5 配置错误检查 ability 的 type 和 class 名称workId 冲突重复 ID每个任务使用唯一 ID后台任务执行超时任务超过 2 分钟拆分大任务、控制在 1 分钟内完成设备重启后任务丢失isPersistedfalse设置为 true八、与其他后台方案对比方案用途执行时长周期能力保活电量消耗workScheduler延迟/周期任务≤ 2 分钟✅ 支持不保活低startBackgroundRunning持续后台任务长时间❌需保活高continuousTask短暂任务≤ 3 分钟❌不保活中前台 Service前台可见任务无限❌系统保活中九、最佳实践优先使用 WIFInetworkType: NETWORK_TYPE_WIFI节省用户流量周期合理日常任务 24h 周期避免小于 1 小时isPersistedtrue设备重启后自动恢复定时任务统一 WorkAbility用 switch 分发不同 workId减少 Ability 数量任务轻量化单次执行控制在 30 秒内避免超时错误处理任务内 try-catch防止未捕获异常导致任务提前终止电量感知低电量或非充电时减少执行// 最佳实践示例 async function scheduleBestPractice(context: Context): Promisevoid { const isCharging await getBatteryStatus(); const networkType isCharging ? workScheduler.NetworkType.NETWORK_TYPE_ANY : workScheduler.NetworkType.NETWORK_TYPE_WIFI; const workInfo: workScheduler.WorkInfo { workId: 1001, bundleName: context.abilityInfo.bundleName, abilityName: SyncWorkAbility, networkType, isPersisted: true, repeatCycleTime: 24 * 60 * 60 * 1000, }; await workScheduler.startWork(workInfo); }十、完整集成示例Entry Component struct GameEntry { aboutToAppear() { this.initBackgroundTasks(); } async initBackgroundTasks() { const ctx getContext() as common.UIAbilityContext; // 启动每日战绩同步 await SyncManager.startDailySync(ctx); // 启动每周排行榜刷新 await SyncManager.startWeeklyRank(ctx); console.info(后台任务初始化完成); } // 游戏结束时触发一次同步 async onGameEnd(score: number) { await syncAfterGame(getContext() as common.UIAbilityContext, score); } }总结workScheduler 是 HarmonyOS 中执行延迟/周期后台任务的推荐方案适合每日数据同步、缓存清理等定时操作。核心要点WorkInfo 配置任务参数、 WorkSchedulerAbility 执行具体逻辑、isPersistedtrue保重启持久化、 WIFI 约束省流量、 任务控制在 2 分钟内、 统一 WorkAbility 分发不同 workId。下一篇将深入 ReminderRequest——闹钟提醒的创建与管理。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源workScheduler API 文档BackgroundTasksKit 概述WorkSchedulerAbility 参考后台任务开发指南module.json5 配置省电优化最佳实践开源鸿蒙跨平台社区HarmonyOS 开发者官方文档第 162 篇bg-running第 164 篇ReminderRequest

相关新闻

数据团队技术债务治理:遗留系统与旧口径的清理策略

数据团队技术债务治理:遗留系统与旧口径的清理策略

数据团队技术债务治理:遗留系统与旧口径的清理策略大家好,我是朱大喜。每个数据团队都有一本"血泪账本":三年前建的 DWD 表还在跑、五年前的业务口径没人说得清来龙去脉、仓库里躺着 200 多张"不知道谁在用"的旧表。技术…

2026/7/29 15:46:38 阅读更多 →
MiniMax开源模型本地部署指南:从环境搭建到性能优化

MiniMax开源模型本地部署指南:从环境搭建到性能优化

MiniMax 作为国内领先的 AI 公司,近期公开呼吁开放模型权重并拥抱开源生态,这一表态在 AI 社区引发了广泛关注。在当前大模型竞争白热化的背景下,开源与闭源路线之争愈发激烈,而 MiniMax 的立场转变可能预示着行业格局的重要变化。…

2026/7/29 15:46:38 阅读更多 →
基于C++与Qt的图书管理系统开发实战:从架构设计到性能优化

基于C++与Qt的图书管理系统开发实战:从架构设计到性能优化

1. 项目概述与核心价值 最近在整理个人技术栈,翻到了几年前用C和Qt写的一个图书信息管理系统。当时是为了练手,也为了帮一个开书店的朋友解决点实际问题。现在回头看,这个项目麻雀虽小,五脏俱全,涵盖了桌面应用开发从界…

2026/7/29 15:46:38 阅读更多 →

最新新闻

Postman集成ForgeJS实现RSA加解密:API测试安全接口实战指南

Postman集成ForgeJS实现RSA加解密:API测试安全接口实战指南

1. 项目概述:为什么API测试需要RSA加解密?如果你经常做API测试,尤其是涉及支付、用户认证、敏感数据传输的场景,一定遇到过这样的需求:接口要求对请求参数进行RSA加密,或者需要对响应结果进行RSA解密来验证…

2026/7/29 15:55:44 阅读更多 →
磨削加工如何正确选择适合的高精度过滤方式

磨削加工如何正确选择适合的高精度过滤方式

很多车间高精度过滤选错,不是设备不行,就是盲目跟风上最贵的。高精度过滤分好几种,滤芯过滤、叠片过滤、负压真空过滤,每种适配的工况完全不一样。我根据多年现场经验,用最直白的话告诉大家,到底该怎么选、…

2026/7/29 15:55:44 阅读更多 →
企业微信CLI开源项目:自动化办公与系统集成实战

企业微信CLI开源项目:自动化办公与系统集成实战

1. 企业微信CLI开源项目概述企业微信作为国内主流的企业级通讯工具,其命令行接口(CLI)的开源实现正在成为开发者社区的热门话题。这个开源项目本质上是通过逆向工程或官方API封装,将企业微信的核心功能暴露在命令行环境中,让开发者能够通过脚…

2026/7/29 15:55:44 阅读更多 →
Spring Boot 4.x安全监控体系升级与Observation API实践

Spring Boot 4.x安全监控体系升级与Observation API实践

1. Spring Boot 4.x安全监控体系升级背景 微服务架构的复杂性正在指数级增长。去年生产环境的数据显示,单个中等规模的Spring Boot应用平均每天会产生超过2.4GB的日志数据,但其中真正有价值的监控信息不足15%。传统的监控方式就像在黑暗森林中打手电筒&a…

2026/7/29 15:55:44 阅读更多 →
“盗版Win11要被封杀?”微软发布TPM新规引发恐慌,真相来了:其实没打算追究个人用户

“盗版Win11要被封杀?”微软发布TPM新规引发恐慌,真相来了:其实没打算追究个人用户

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)“盗版 Windows 11 要凉了?”最近,一则关于微软加强 TPM 安全机制的消息在技术社区引发热议。不少用户看到标题后第一反应是:微软是不是终于要动真格了,准…

2026/7/29 15:55:44 阅读更多 →
LENA-R8与PIC18F86J16在物联网中的全球连接与定位方案

LENA-R8与PIC18F86J16在物联网中的全球连接与定位方案

1. 项目背景与核心需求 在物联网和移动设备领域,全球连接和精确定位一直是两大关键技术痛点。传统解决方案往往需要分别部署通信模块和定位模块,不仅增加了硬件复杂度,也提高了功耗和成本。LENA-R8系列模组与PIC18F86J16微控制器的组合&#…

2026/7/29 15:54:43 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻