【OpenHarmony/HarmonyOs 】从数学学习 App 出发:近场快传、实况窗与全场景智慧学习设计

项目类型:OpenHarmony / HarmonyOS ArkTS 数学学习应用
文章主题:近场快传、实况窗、全场景智慧生活
说明:本文基于“数学视界”现有项目能力,讨论如何把学习应用扩展到 HarmonyOS 全场景体验中 📚

一、为什么数学应用也适合做全场景?

很多人一提到“全场景智慧生活”,第一反应是智能家居、车机、手表、音箱。但学习类应用同样非常适合全场景:

  • 手机上做题,平板上看解析;
  • 课堂上把曲线方案快速分享给同学;
  • 倒计时挑战可以在状态栏持续提醒;
  • 收藏的公式、错题、图形模型可以在不同设备之间流转;
  • 家长或老师可以通过轻量入口查看学习进度。

我的项目“数学视界”本身已经具备一些全场景扩展基础:

  • deviceTypes 支持 phonetablet
  • 题库、收藏、成就、学习统计都集中在 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
  • 挑战答题结果;
  • 学习目标设置;
  • 成就解锁进度。

学习应用的粘性不只来自功能丰富,也来自“我的努力不会丢”。备份恢复正是这种安全感的一部分。

八、实现建议:先做结构化,再接系统能力

如果想把数学视界继续扩展成全场景学习应用,我建议按这个顺序来:

  1. 先把收藏、题目、画板、挑战结果都整理成可序列化数据;
  2. 再做导出/导入,确保跨设备数据能被正确恢复;
  3. 接入近场分享,把曲线方案、错题包、公式卡片变成可传输对象;
  4. 接入实况窗,把挑战倒计时、每日目标提醒变成系统级持续任务;
  5. 最后做多设备体验优化,比如平板大屏画板、手机快速答题。

这样做的好处是:底层数据稳定,系统能力只是更换不同的“出口”。

九、总结

围绕“近场快传、实况窗、全场景智慧生活”这个主题,数学视界可以形成一条很自然的演进路线:

  • 📦 通过结构化 graphData 分享曲线方案;
  • ⏱ 通过挑战倒计时扩展实况窗提醒;
  • 📱 通过 phone + tablet 适配覆盖不同学习设备;
  • ☁️ 通过备份恢复保护学习资产;
  • 🧠 通过统一 AppState 组织学习数据和统计结果。

全场景体验的重点不是炫技,而是让用户在不同设备、不同时间、不同学习状态下,都能自然接上自己的学习任务。对数学视界来说,这正是下一步可以继续打磨的方向。🚀

参考资料:

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐