【OpenHarmony/HarmonyOs 】从数学学习 App 出发:近场快传、实况窗与全场景智慧学习设计
【OpenHarmony/HarmonyOs 】从数学学习 App 出发:近场快传、实况窗与全场景智慧学习设计
项目类型:OpenHarmony / HarmonyOS ArkTS 数学学习应用
文章主题:近场快传、实况窗、全场景智慧生活
说明:本文基于“数学视界”现有项目能力,讨论如何把学习应用扩展到 HarmonyOS 全场景体验中 📚
一、为什么数学应用也适合做全场景?
很多人一提到“全场景智慧生活”,第一反应是智能家居、车机、手表、音箱。但学习类应用同样非常适合全场景:
- 手机上做题,平板上看解析;
- 课堂上把曲线方案快速分享给同学;
- 倒计时挑战可以在状态栏持续提醒;
- 收藏的公式、错题、图形模型可以在不同设备之间流转;
- 家长或老师可以通过轻量入口查看学习进度。
我的项目“数学视界”本身已经具备一些全场景扩展基础:
deviceTypes支持phone和tablet;- 题库、收藏、成就、学习统计都集中在
AppState; - 画板支持将曲线模型序列化为 JSON;
- 挑战答题有计时器和实时进度;
- 项目配置了
BackupExtensionAbility,具备备份恢复扩展点。
这意味着项目虽然目前还是一个本地数学学习应用,但结构上已经可以继续扩展到“多设备协同学习”。
二、当前项目的全场景基础
在 entry/src/main/module.json5 中,项目声明了手机和平板:
"deviceTypes": [
"phone",
"tablet"
]
这一步很基础,但很重要。数学学习应用在平板上天然有优势:屏幕更大,公式、图形、题目解析都能展示得更完整。
项目还配置了备份扩展能力:
"extensionAbilities": [
{
"name": "EntryBackupAbility",
"srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
"type": "backup",
"exported": false,
"metadata": [
{
"name": "ohos.extension.backup",
"resource": "$profile:backup_config"
}
]
}
]
对应的 backup_config.json:
{
"allowToBackupRestore": true
}
这说明学习数据、收藏数据、成就数据未来可以纳入系统备份恢复方案。对于学习类应用来说,这一点很关键,因为用户最在意的是:我收藏的公式、画过的图、刷过的题,换设备后还能不能回来。
三、近场快传:把曲线方案变成可分享的学习资料
数学视界里最适合做近场分享的是“曲线画板”。在画板页中,用户可以创建圆、双曲线、椭圆、抛物线、函数图像,并把当前方案保存到收藏。
现有代码里已经有一段很适合作为分享数据源:
saveToFavorites(): void {
const graphData: string = JSON.stringify({
models: this.modelList,
functions: this.functionGraphs,
range: this.graphRange,
name: this.boardName
})
AppState.addFavorite({
id: '',
type: 'graph',
title: this.boardName,
content: '曲线模型 x' + this.modelList.length + ' | 函数 x' + this.functionGraphs.length,
category: '图形',
icon: '🎨',
tags: ['图形探究'],
createdAt: 0,
updatedAt: 0,
graphData: graphData,
})
}
这里的 graphData 本质上就是一份轻量学习资产:
models:圆、双曲线、椭圆等参数模型;functions:函数表达式;range:坐标范围;name:画板名称。
如果要接入近场快传,推荐不要直接传整页状态,而是定义一个清晰的数据包:
interface ShareGraphPackage {
type: 'math_graph'
version: number
title: string
models: MathModel[]
functions: FuncGraph[]
range: DrawGraphRange
createdAt: number
}
这样做的好处是:
- ✅ 数据结构稳定,后续升级可以通过
version兼容; - ✅ 只分享学习资料,不分享用户隐私数据;
- ✅ 接收方可以直接打开画板复现图形;
- ✅ 适合课堂、讨论、小组作业等场景。
实际接入近场能力时,可以根据目标 SDK 和服务类型选择系统分享、近场传输或业务侧二维码等方案。数学类内容建议优先分享结构化 JSON,而不是截图,因为结构化数据可以继续编辑。
四、实况窗:把挑战倒计时放到系统级提醒中
数学视界的挑战答题页已经有倒计时逻辑:
if (cfg.timeLimit !== undefined && cfg.timeLimit > 0) {
this.questionTimer = cfg.timeLimit
this.questionTimerHandler = setInterval(() => {
if (!this.isPaused && this.questionTimer > 0) {
this.questionTimer--
if (this.questionTimer === 0) {
this.autoSubmit()
}
}
}, 1000)
}
在普通应用内部,这个倒计时只显示在答题页。但如果结合实况窗思路,就可以把它扩展为系统级的“正在进行任务”:
- 状态栏胶囊显示:第 3 / 10 题,剩余 12 秒;
- 锁屏卡片显示:数学挑战进行中,当前正确率 80%;
- 通知中心卡片显示:继续答题、暂停挑战、结束挑战;
- 答题结束后自动关闭实况窗,并展示得分。
一个业务层的状态模型可以这样设计:
interface ChallengeLiveState {
sessionId: string
currentIndex: number
totalCount: number
remainingSeconds: number
correctCount: number
status: 'running' | 'paused' | 'finished'
}
然后在答题页的计时器里同步状态:
private buildLiveState(): ChallengeLiveState {
return {
sessionId: this.questionStartTime.toString(),
currentIndex: this.currentIndex + 1,
totalCount: this.questions.length,
remainingSeconds: this.questionTimer,
correctCount: this.calculateCorrect(),
status: this.isPaused ? 'paused' : 'running',
}
}
注意,实况窗不是普通通知,它更适合“正在发生、持续变化、有明确结束”的任务。数学挑战正好符合这三个条件:
- ⏱ 有倒计时;
- 📈 有进度;
- 🎯 有完成结果。
五、全场景智慧学习:不是多端复制,而是任务流转
全场景不等于把手机页面拉伸到平板,也不等于每个设备都做一遍完整功能。更好的思路是“不同设备承担不同学习任务”。
我给数学视界设计的全场景任务分工如下:
| 场景 | 适合能力 | 体验目标 |
|---|---|---|
| 手机 | 快速刷题、收藏公式、查看进度 | 随时学一点 |
| 平板 | 曲线画板、公式推导、错题复盘 | 大屏深度学习 |
| 状态栏/实况窗 | 挑战倒计时、目标提醒 | 不打断但持续提醒 |
| 近场分享 | 曲线方案、错题包、公式卡片 | 课堂协作 |
| 备份恢复 | 学习统计、收藏、成就 | 换机不丢数据 |
这个设计的核心是:围绕“学习任务”做流转,而不是围绕“页面”做复制。
六、AppState:全场景扩展的关键中枢
数学视界中大量学习数据都集中在 AppState.ets:
studyData: StudyData = {
totalStudyDays: 0,
currentStreak: 0,
totalDrawings: 0,
totalCalculations: 0,
totalFunctions: 0,
totalFormulasViewed: 0,
totalUnitsConverted: 0,
lastStudyDate: '',
dailyGoal: 5,
todayCount: 0,
consecutiveGoalMetDays: 0,
funFactsViewed: 0,
}
挑战统计也集中管理:
challengeStats: ChallengeStats = {
totalChallenges: 0,
totalQuestions: 0,
totalCorrect: 0,
totalTimeSpent: 0,
averageScore: 0,
bestScore: 0,
currentStreak: 0,
longestStreak: 0,
masteredGrades: [],
masteredKnowledge: [],
recentResults: [],
categoryStats: {},
}
这种单例状态管理虽然简单,但对当前项目很实用:UI 页面不需要各自维护一套统计逻辑,后续要做备份、同步、分享、导出时,也能从一个地方整理数据。
如果后续继续增强,我会把 AppState 拆成三层:
LearningRepository:负责学习数据持久化;ChallengeRepository:负责挑战结果和错题;SharePackageBuilder:负责构造分享数据包。
这样近场快传、实况窗、备份恢复都不会直接依赖 UI 页面。
七、备份恢复:学习应用的“安全感”
项目里的 EntryBackupAbility 当前是基础实现:
export default class EntryBackupAbility extends BackupExtensionAbility {
async onBackup() {
hilog.info(DOMAIN, 'testTag', 'onBackup ok')
await Promise.resolve()
}
async onRestore(bundleVersion: BundleVersion) {
hilog.info(DOMAIN, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion))
await Promise.resolve()
}
}
后续可以把以下数据纳入备份:
- 收藏的公式与知识点;
- 曲线画板的
graphData; - 挑战答题结果;
- 学习目标设置;
- 成就解锁进度。
学习应用的粘性不只来自功能丰富,也来自“我的努力不会丢”。备份恢复正是这种安全感的一部分。
八、实现建议:先做结构化,再接系统能力
如果想把数学视界继续扩展成全场景学习应用,我建议按这个顺序来:
- 先把收藏、题目、画板、挑战结果都整理成可序列化数据;
- 再做导出/导入,确保跨设备数据能被正确恢复;
- 接入近场分享,把曲线方案、错题包、公式卡片变成可传输对象;
- 接入实况窗,把挑战倒计时、每日目标提醒变成系统级持续任务;
- 最后做多设备体验优化,比如平板大屏画板、手机快速答题。
这样做的好处是:底层数据稳定,系统能力只是更换不同的“出口”。
九、总结
围绕“近场快传、实况窗、全场景智慧生活”这个主题,数学视界可以形成一条很自然的演进路线:
- 📦 通过结构化
graphData分享曲线方案; - ⏱ 通过挑战倒计时扩展实况窗提醒;
- 📱 通过
phone + tablet适配覆盖不同学习设备; - ☁️ 通过备份恢复保护学习资产;
- 🧠 通过统一
AppState组织学习数据和统计结果。
全场景体验的重点不是炫技,而是让用户在不同设备、不同时间、不同学习状态下,都能自然接上自己的学习任务。对数学视界来说,这正是下一步可以继续打磨的方向。🚀
参考资料:

更多推荐


所有评论(0)