50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

从“探索”到“布道”,一个「鸿蒙领航者」的炼成记

  • 2025-11-06
    北京
  • 本文字数:4118 字

    阅读完需:约 14 分钟

大小:1.22M时长:07:07
从“探索”到“布道”,一个「鸿蒙领航者」的炼成记

2019 年 8 月,即将踏入大学校园的李浩佳第一次在新闻中看到了“HarmonyOS”的名字。那时的他,还只是一个对软件工程充满好奇的新生,未曾想到这会成为他职业生涯的重要注脚。


六年过去,鸿蒙已从一个陌生的名词,变成了他日常开发的核心技术栈。他也从一名普通开发者成长为社区的技术分享者,持续为鸿蒙生态贡献力量。


李浩佳正在敲代码


李浩佳带着骄傲对 InfoQ 说,由于在国内外平台积极分享,他已经两次获得“HarmonyOS 学习资源创作先锋”的荣誉称号。

从好奇到职业选择


大学期间,鸿蒙的多设备分布式架构深深吸引了李浩佳。为了追赶技术潮流,他加入了多个开发者交流群,并在其中结识了一位志同道合的产品经理。两人一拍即合,共同参加 HarmonyOS 极客马拉松比赛,开发了他们的第一个鸿蒙应用——一款名为“滴答时钟”的小工具。这次经历不仅让他对鸿蒙的技术潜力有了更深的认知,也为他未来的职业道路埋下了伏笔。


李浩佳最初接触的技术栈是 python,他表示,在迁移到鸿蒙技术栈的过程中从语法上没有过多阻碍,但是从整体项目工程结构再到具体的单个 module 包的理解上还是需要更多经验积累。


2023 年 8 月,李浩佳毕业时,鸿蒙生态的开发者数量已突破 220 万,API 日调用次数高达 590 亿次。这一数据背后,是鸿蒙技术的快速发展和广泛应用。而李浩佳所在的公司,也遇到越来越多的鸿蒙开发需求,他因此正式踏上了鸿蒙开发的职业道路。


“早期实践中,鸿蒙的‘一次开发,多端部署’能力让我确信了他在物联网领域的巨大潜力。”李浩佳说,“同时,ArkUI 与 ArkTS 在开发效率上展现出卓越优势,尤其在多 UI 适配工作中,为我们大幅节省了时间与代码量。在处理平板、折叠屏的 UI 适配过程中,ArkUI 能快速完成适配工作。”

攻坚首批 HarmonyOS NEXT 应用


网鱼 APP 是李浩佳参与开发的第一个 HarmonyOS NEXT 应用。作为网鱼网咖的官方配套服务,它承担着远程座位预订、酒店预订、在线充值等核心功能。


这个项目成为了李浩佳职业开发之路上的重要试炼场。


“网鱼 APP 算是第一批接入鸿蒙的应用, 整个 APP 都以 HarmonyOS NEXT 作为技术支持。”李浩佳表示。


作为先行者,团队在开发过程中遇到了诸多技术难题。“接入高德地图时,由于缺乏相关技术博客和参考资料,我们只能在高德的官方 API 文档中一点点的寻找和学习,”李浩佳回忆道,“除此之外,当时的高德地图星河版也是首版,在使用过程中,我们也发现了一些问题,需要不断与高德技术团队沟通解决。”这些沟通磨合最终促进了两款应用的共同完善。


在项目开发中,他们还曾在性能和数据驱动更新方面遇到技术困难。


在酒店详情页的实现过程中,由于涉及大量并发数据请求与复杂视图渲染,主线程出现明显阻塞,严重影响用户体验。为优化这一问题,李浩佳团队引入了懒加载机制,有效延后非关键资源的加载时机,从而显著提升了页面响应流畅度。


此外,在地图模块的开发中,由于初始数据结构层级过深、嵌套复杂,导致状态变化无法准确触发 UI 同步更新。针对这一痛点,李浩佳团队通过重构数据模型、简化层级关系,成功建立起稳定可靠的数据-UI 联动机制,确保了视图与状态的一致性。


李浩佳表示,高德与携程等应用在鸿蒙生态的先行上架,为他们的技术路径与用户体验设计提供了重要的参考与信心。


经过不断攻坚,网鱼 APP 首版上线,成功打通了该平台下的核心业务闭环,实现了鸿蒙侧用户的网咖预订功能。作为网鱼最主要的业务线,此功能的落地标志着网鱼 APP 鸿蒙版本具备了完整的服务能力。



沉浸式的一个工具
/* * @des 沉浸式屏幕 * @author lhj * @data 2025/03/27 * */class ScreenManager { private static instance: ScreenManager; // 单例, 静态模式,全局就一个。 private topSafeHeight: number = 0; private bottomSafeHeight: number = 0; private constructor() { }
public static getInstance(): ScreenManager { if (!ScreenManager.instance) { ScreenManager.instance = new ScreenManager(); } return ScreenManager.instance; }
getTopSafeHeight() { return this.topSafeHeight; }
getBottomSafeHeight() { return this.bottomSafeHeight; }
/* * @des 开启沉浸式 * */ setFullScreen(windowStage: window.WindowStage) { let windowClass: window.Window = windowStage.getMainWindowSync() let isLayoutFullScreen = true try { windowClass.setWindowLayoutFullScreen(isLayoutFullScreen) let bottomType = window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR let bottomAvoidArea = windowClass.getWindowAvoidArea(bottomType) let bottomRectHeight = bottomAvoidArea.bottomRect.height //底部导航栏高度
let topType = window.AvoidAreaType.TYPE_SYSTEM let topAvoidArea = windowClass.getWindowAvoidArea(topType) let topAvoidHeight = topAvoidArea.topRect.height //顶部状态栏高度
this.setTopSafeHeight(px2vp(topAvoidHeight)) this.setBottomSafeHeight(px2vp(bottomRectHeight)) } catch (e) { console.log("fullScreenError", e) } }
/* * @des 注册监听函数 * */ registerWindowListener(windowStage: window.WindowStage) { let windowClass: window.Window = windowStage.getMainWindowSync() // 3. 注册监听函数,动态获取避让区域数据 windowClass.on('avoidAreaChange', (data) => { if (data.type === window.AvoidAreaType.TYPE_SYSTEM) { let topRectHeight = data.area.topRect.height; console.log('avoidAreaChangeee: ' + topRectHeight) this.setTopSafeHeight(px2vp(topRectHeight)) } else if (data.type == window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) { let bottomRectHeight = data.area.bottomRect.height; this.setBottomSafeHeight(px2vp(bottomRectHeight)) } }); } /* * @des 控制状态栏的显隐 ,false:隐藏。true 显示 * */ setStatusBarVisibility(windowStage: window.WindowStage,topShow: boolean, bottomShow: boolean) { let windowClass: window.Window = windowStage.getMainWindowSync() windowClass.setSpecificSystemBarEnabled('status', topShow).then(() => { console.info('Succeeded in setting the status bar to be invisible.'); }).catch((err: BusinessError) => { console.error(`Failed to set the status bar to be invisible. Code is ${err.code}, message is ${err.message}`); }); // 2. 设置导航条隐藏 windowClass.setSpecificSystemBarEnabled('navigationIndicator', bottomShow).then(() => { console.info('Succeeded in setting the navigation indicator to be invisible.'); }).catch((err: BusinessError) => { console.error(`Failed to set the navigation indicator to be invisible. Code is ${err.code}, message is ${err.message}`); }); }
private setTopSafeHeight(topSafeHeight: number) { this.topSafeHeight = topSafeHeight; }
private setBottomSafeHeight(bottomSafeHeight: number) { this.bottomSafeHeight = bottomSafeHeight; }}
export const screenManager = ScreenManager.getInstance()
复制代码

李浩佳为鸿蒙 APP 设计的沉浸式工具

成为布道者


作为鸿蒙生态的积极参与者,李浩佳所在公司也建立了每周一次的学习小组。他也将内部交流和个人心得转化为系统化的学习资源,并在国内外平台积极分享。


“当时正值鸿蒙开发的初期阶段,很多开发者都在摸索中前行。”李浩佳回忆道,“为了帮助大家更快上手,我们每周都会组织讨论会,大家的参与热情非常高。”


其中,路由框架的升级迭代给他留下深刻印象:在项目收尾阶段,团队面临从传统 router 方案向官方推荐的 Navigation 框架迁移的挑战。


"Navigation 虽然功能强大,但实现复杂度提升,直接使用会影响 UI 渲染和生命周期。"为了减少修改的代码量,李浩佳团队对 Navgation 进行了二次封装,只需要由外部传入一个 Builder 就可以完成当前页面的路由替换,降低了在修改路由框架时造成代码丢失的风险。


对技术的热情,让鸿蒙开发者社区多了一位叫“北花南树”的布道者。


让他没想到的是,这些基于实战经验的总结让他在鸿蒙开发者社区中两次获得“HarmonyOS 学习资源创作先锋”称号。


李浩佳表示,鸿蒙“一次开发,多端部署”的特点让他持续投入。他表示,这为创新提供了无限可能,借由这一功能,他可以构思以前在单设备上无法实现的功能——手机游戏可以无缝流转到智慧屏上,让用户得以利用大屏和更好的音响;导航应用可以在手机、手表和车机间无缝切换,让用户体验更加流畅。


对于鸿蒙开发者,李浩佳也给了几点实用建议:

  1. 学习路径

建议新手从 DevEco Studio 工具入手,系统学习 ArkUI/ArkTS 语法,深入理解鸿蒙架构体系。官方视频教程结合 API 文档是最佳学习资源。

  1. 开发实践

注意区分元服务和 APP 开发两种应用中 API 的区别,也要考虑到后续不同设备适配的问题。建议与产品、UI 团队充分沟通,提前提出解决方案,或参考官方示例解决问题。最重要的一点是及时了解鸿蒙的新特性。

  1. 性能优化

避免状态变量滥用,深入理解状态管理机制,使用性能优化组件。开发前需制定完善的技术方案,开发过程中进行代码评审,发现不合格代码即时找到相关开发人进行纠正。


对于生态发展,李浩佳充满期待:“当前三方库的建设仍然是一片蓝海,期待更多开发者加入,共同完善基础设施,这将显著提升开发效率,也有利于独立开发者创新。”


“我深信鸿蒙系统的未来充满潜力,并由衷期盼它能持续成长。在为鸿蒙生态贡献力量的过程中,这本身也是一段让我个人不断进步、收获反哺的旅程。”李浩佳说。


从最初的兴趣萌发,到如今的深度参与、积极布道,李浩佳既是鸿蒙技术的受益者,也是推动生态繁荣的贡献者。在鸿蒙的舞台上,他用自己的代码、分享与坚持,诠释了技术与社区的力量。正是无数像他这样的开发者,让鸿蒙的未来充满无限可能。

2025-11-06 15:08674

评论

发布
暂无评论
从“探索”到“布道”,一个「鸿蒙领航者」的炼成记_HarmonyOS_付秋伟_InfoQ精选文章