15 年大数据老兵鸿蒙“造梦”,父女联手打造亲子游戏 App

  • 2026-01-07
    北京
  • 本文字数:4562 字

    阅读完需:约 15 分钟

欢迎关注 【InfoQ鸿蒙专区】获取更多鸿蒙动态、创新实践!

在鸿蒙开发者生态中,从不缺乏跨界探索的身影。徐俊宸便是其中一位特殊的存在:深耕大数据领域多年,从数据产品经理到大数据讲师,他的职业生涯始终围绕数据打转;而一次偶然的鸿蒙论坛经历,让他萌生了开发 APP 的想法。最终,他以女儿课堂上的猜数字游戏为蓝本,与女儿一起打造出《猜数字大师》游戏应用,在跨界鸿蒙开发的道路上,既攻克了技术难关,也收获了别样的亲子时光。

鸿蒙缘起:数据人的跨界尝试,始于一次偶然

“我之前的工作主要跟大数据打交道,就是把各个系统的数据融汇过来变成数据中心,做可视化分析、报表和建模,本质上是数据产品经理,现在则是一名大数据讲师。”谈及过往经历,徐俊宸直言,在此之前,APP 开发对他而言只是“旁观者”视角,从未想过自己会亲手实践。

而这场跨界的契机,源于一次偶然的相遇。“真正萌生自己做 APP 的想法,是 25 年 9 月初参加了鸿蒙主办的一个论坛,看到台上有小伙伴分享自己的 APP,就想试着干一下。”徐俊宸说,在此之前,他仅通过华为开发者学堂的认证对鸿蒙有过理论层面的了解,并无实际开发经验,“一开始也担心门槛太高,会直接放弃,特意搜了资料,了解了做游戏和应用的区别,才敢迈出第一步。”

徐俊宸(右二)首次参加 HDD · 鸿蒙赋能交流会并获奖

选择以女儿课堂上的猜数字游戏为开发方向,徐俊宸有着自己的考量:“我之前用 H5 做过类似的猜数字游戏,这个游戏逻辑不复杂,只要设置一个随机数,再判断输入数字的高低并给出提醒就行,对我来说相对简单。”而这个想法也得到了女儿的积极响应,“女儿在培训课上,老师会在课间组织同学们玩一到 100 的猜数字游戏,她本身就很喜欢,听到要把游戏变成手机 APP,特别开心。”

至于为何选择鸿蒙生态,徐俊宸表示:“我考过鸿蒙开发者学堂的认证,有过一些学习基础,而且我的手机也是鸿蒙系统,身边也有小伙伴推荐我学习,相当于有了天然的条件。”而过往的大数据工作经验,也为他的跨界提供了助力:“做数据的都会考虑数据怎么存储,鸿蒙有数据持久化的类,不需要关系型数据库支持,这让我一开始就确定了做单机版的思路,后续再考虑完善后台。”

“想没有答案,做才有结果。”徐俊宸用这句话总结自己的跨界初衷,正是这份“先做再说”的勇气,让他从大数据领域成功踏入鸿蒙开发的新赛道。

技术闯关:边学边做,攻克鸿蒙开发的“拦路虎”

确定开发方向后,徐俊宸开始了“一边想一边做”的“升级打怪”之路。“一开始只是想做几个难度选择,比如一到十、一到一百、一到一千,后来觉得光有难度选择不够有趣,就加了历史记录功能,记录答题失败的次数;还设计了成就系统,比如最快答题成就、完成十轮答题的成就,让用户有持续玩下去的动力。”他还透露,自己曾设计过一到一百万的“地狱难度”,但因概率太低、难以完成,后续会进行迭代改进。

为了顺利落地项目,徐俊宸做了不少前期功课:“鸿蒙的文档和 Demo 都很全,我看了很多相关技术文档,比如单机类游戏 APP 需要了解广告 SDK 的模块设计。”对于不擅长的 UI 设计,他则借助了 AI 和朋友的力量:“图标、UI 设计这些我都不太会,是找朋友帮忙,也用了 AI 辅助。”

在开发过程中,徐俊宸遇到的第一个技术难题便是“沉浸式全屏显示”。“因为 APP 默认分为顶部、中间和底部三部分,顶部会显示时间、信号,底部有类似按键的设计,而游戏需要全屏显示,一开始我完全不知道该怎么实现。”他回忆道,这个问题足足试了三天才解决,“后来看了鸿蒙的相关文档和 Demo,才知道需要通过函数规划来实现全屏效果。”

● 沉浸式全屏显示

async aboutToAppear(): Promise  {// ⭐ 【防御性全屏设置】确保协议页面也是全屏显示try {const context = getContext(this) as common.UIAbilityContextconst windowClass = await window.getLastWindow(context)await windowClass.setWindowLayoutFullScreen(true)hilog.info(DOMAIN, TAG, '✅ AgreementPage全屏设置成功')} catch (error) {hilog.warn(DOMAIN, TAG, ⚠️ AgreementPage全屏设置失败: ${JSON.stringify(error)})}}
复制代码

另一个让他花费不少精力的是背景音乐的处理:“背景音乐要循环播放,还要和女儿的配音形成双重声音,同时得设置开关可以关闭背景音乐,这些都是一开始没考虑到的,后来查了很多资料才搞定。”

● 背景音乐循环

1. 底层播放器逻辑 (HarmonyAudioPlayer 类)

这里是实现循环播放的最底层核心。鸿蒙 AVPlayer 提供了一个 loop 属性,将其设置为 true 即可实现自动循环,无需手动监听播放结束事件。

// 在 initialize() 方法中:状态准备好后立即开启循环// 位于 this.player.on('stateChange', ...) 回调内case 'prepared':this._state = PlayerState.PREPARED// 核心点:如果是背景音乐,设置 loop = trueif (this._type === AudioType.BACKGROUND_MUSIC) {this.player.loop = true; }break; // 在 initialize() 方法底部:设置资源 FD 时再次确认this.player.fdSrc = avFileDescriptorif (this._type === AudioType.BACKGROUND_MUSIC) {this.player.loop = true; // 确保加载资源时开启循环}
复制代码

// 在 play() 方法中:每次播放前进行“双重保险”async play(): Promise<void> {// ... 前置检查代码 ... // 核心点:播放前强制确认循环开关if (this._type === AudioType.BACKGROUND_MUSIC) {this.player.loop = true;} await this.player.play();this._state = PlayerState.PLAYING;}
复制代码

2.管理层控制逻辑 (AudioManager 类)

为了防止循环失效,管理类中增加了一个专门的“保险”方法 ensureBackgroundMusicLoop,并在开始播放前后调用。

/**核心方法:开始播放背景音乐*/async startBackgroundMusic(): Promise {if (!this.config.backgroundMusicEnabled || !this.backgroundMusicPlayer) {return;}try {await this.backgroundMusicPlayer.setVolume(this.config.backgroundMusicVolume);// 关键步骤:播放前强制检查循环状态this.ensureBackgroundMusicLoop();await this.backgroundMusicPlayer.play();// 关键步骤:播放后再次确认(应对某些设备状态异步更新延迟)this.ensureBackgroundMusicLoop();} catch (error) {// 错误处理...}}
复制代码

/**辅助方法:确保 AVPlayer 的 loop 属性为 true*/ensureBackgroundMusicLoop(): void {if (!this.backgroundMusicPlayer) {return;}// 强制类型转换为具体实现类以访问底层 playerconst player = this.backgroundMusicPlayer as HarmonyAudioPlayer;const harmonyPlayer = player.getAVPlayer();// 如果检测到循环未开启,则手动开启if (!harmonyPlayer.loop) {harmonyPlayer.loop = true;}}
复制代码

谈及快速入门鸿蒙开发的方法,徐俊宸分享:“我完全是自学,看鸿蒙的实验课、查资料,还有一部分靠 AI。鸿蒙的 Demo 很丰富,我会参照 Demo 演示,自己再写一遍尝试,一遍遍改,慢慢就熟悉了。”他还提到了 AI 在开发中的作用:“我会用自己习惯的一些 AI Coding 工具写代码,然后用 DevEco Studio 集成的 CodeGenie 改 Bug,从我的实际体验来看,CodeGenie 在代码审查纠错等方面有着非常大的优势,减轻了我不少 DeBug 的工作量。”

值得一提的是,徐俊宸的女儿不仅是 APP 的灵感来源,更是产品的“头号内测官”和参与者。“游戏里面的音效都是我女儿参与配音的,她非常感兴趣,好几个晚上我一下班就拉着她录制各种音效。”徐俊宸说,“配音好了后她也深入玩了好几轮游戏,给我反馈一些体验细节问题,比如‘声音太轻’、‘情绪问题’等等;而且她也从自己的游玩体验,给了我一些关卡的难度建议。”

在徐俊宸看来,鸿蒙生态对跨行业开发者最大的吸引力在于“文档和 Demo 齐全”:“我做这款 APP,百分之八九十都是通过鸿蒙的文档和 Demo 学习实现的,比如全屏、广告 SDK、音乐相关的介绍,虽然部分功能没有直接的 Demo,但相关的技术讲解也能提供方向,要是没有这些资源,我可能很难坚持做下来。”

徐俊宸建议初学者优先学习的技术文档:【HarmonyOS应用开发快速入门】

初心不辍:技术为翼,探索小 APP 里的大天地

从 9 月开始筹备,到 11 月正式上线,徐俊宸利用零散时间完成了《猜数字大师》的开发,而这段跨界经历,也让他有了更多新的规划。“12 月我已经做了一个提升小孩专注力的应用,还没上线,正在精细化打磨。”他透露,这款应用类似“数字排序”,通过打乱一到一百的数字让用户排序来提升专注力,“关卡上,我打算增加更多测试场景,从 30 几个扩展到 50 几个;UI 优化上,我想做得更卡通、色彩更鲜艳,这样更符合儿童的偏好;另外在设备支持方面,也想更进一步,去适配平板甚至电脑等设备。”

对于《猜数字大师》,他也有迭代计划:“现在只有四个难度,后续会增加更多难度提升可玩性;里面的文字想都录成女儿的声音,还想尝试让她唱首歌放进去当背景音乐等。”

这段“父女档”开发经历,不仅让 APP 更具温度,也让亲子关系更加融洽。“女儿会把 APP 分享给同学,她通过与同学和家长的交流互动,特别有成就感。”徐俊宸说,虽然女儿不懂技术,但会骄傲地跟同学说“这是爸爸用鸿蒙做的”,“这种共同完成一件事的过程,让我们的沟通更多了,她也会更主动地参与到后续的优化中,比如想到加‘加油’、‘你真棒’这类鼓励的声音。”

对于其他想要转型鸿蒙开发的跨行业从业者,徐俊宸分享了三个核心经验,既覆盖开发过程,也涉及落地关键环节:“第一,多关注鸿蒙官方论坛的开源 Demo,每一章节都有详细的分享,比如 UI 相关的内容很丰富,能学到很多实操技巧;第二,善用 AI 解决 Bug,遇到问题可以让 AI 提供解决方案,然后形成文档,避免重复犯错,比如变量同名、多打空格这类编译失败的细节问题,AI 都能辅助排查;第三,上线前一定要用真机充分测试,不能只靠虚拟机,尤其是游戏类应用,要测试声音、适配效果、广告展示,还有无网络情况下的使用场景,我当时光改 Bug 就花了半个月到一个月,边测边做能减少后续问题。”

除此之外,他还特意补充了 APP 上架阶段的避坑要点——游戏 APP 与普通应用 APP 在上架准入环节存在诸多核心差异,提前理清这些规则能大幅减少弯路,具体对比如下:

📊 鸿蒙“游戏 APP” vs “普通应用 APP” 准入对比表

结语:生态赋能,让每一份热爱都有回响

从大数据领域的资深从业者,到鸿蒙开发的跨界新人,徐俊宸的经历印证了“想没有答案,做才有结果”的初心。鸿蒙生态的完善文档、丰富 Demo 和友好的入门门槛,为跨行业开发者提供了成长的土壤;而亲情的陪伴与支持,则让技术创作有了更温暖的底色。

在鸿蒙生态中,像徐俊宸这样的开发者还有很多,他们或许来自不同领域,有着不同的技术背景,但都凭借对技术的热爱和对生活的观察,在鸿蒙的土壤上实现着自己的创作梦想。而鸿蒙生态也始终以开放、包容的姿态,为每一位开发者提供资源与支持,让无论是技术老兵还是跨界新人,都能在这里找到属于自己的价值。

未来,随着生态的不断壮大,相信会有更多开发者带着热爱与初心加入,用技术赋能生活,让每一份创意都能落地生根,让每一次跨界都能收获成长与感动。而这,正是鸿蒙生态最珍贵的价值——让技术不再遥远,让创作触手可及,让每一位开发者都能成为生态的建设者与受益者。

欢迎体验父女联手之作点击下载《猜数字大师》

欢迎关注 【InfoQ鸿蒙专区】获取更多鸿蒙动态、创新实践!

扫描下方二维码加入鸿蒙技术交流群↓