HarmonyOS 应用开发学习记录 - 从Windows开发者视角看鸿蒙开发

起始

        2024年6月21日召开的华为开发者大会2024上宣布Harmony OS NEXT(即鸿蒙星河版)面向开发者启动Beta版,这也被人们称为“纯血鸿蒙”,它基于鸿蒙内核,不再兼容安卓开发的APP应用。

        时至今日近一年了,我也有了尝试鸿蒙系统的念头。

        这个系列,将记录我逐步学习 HarmonyOS 应用开发的过程,记录一位老牌 Windows 程序员视角下转型开发的过程,沉淀自己所学,如果能为大家带来一些帮助,幸甚之至。文章中的不当之处,请及时指正,感谢!

        在写这篇文章前,我在华为官方开发者文档上学习了几天,当前(205年06月10日) HarmonyOS SDK 版本是 5.0.5(17),后续内容都是基于此版本的讨论,最新的版本可以在这里查看。

        第一篇,主要是谈谈从Windows开发者感受HarmonyOS的差异,以及开发转型需要注意的技术细节。

        坦白地说,学习了几天 HarmonyOS 开发,对于 Windows C++/Delphi 原生开发的我来说:

开发体感差异巨大       

        首先,对有其他系统程序开发经验,尤其是有 Windows 系统开发经验的朋友提个醒,HarmonyOS 上的开发思路、体感和过去的“程序”截然不同。

  •         开发语言 - ArKTS扩展自TypeScript的HarmonyOS应用开发官方高级语言。前端对此更亲切。
  •         开发IDE -  DevEco Studio 基于IntelliJ IDEA Community开源版本打造。Java开发者狂喜,与idea基本一样。
  •         开发范式 - 分别是基于ArkTS的声明式开发范式(简称“声明式开发范式”)和兼容JS的类Web开发范式(简称“类Web开发范式”)。前端又狂喜。

        HarmonyOS 有很多缝合的观感,就比如开发过程,让我有种拿着JAVA IDE 写前端的体感。甚至,像是在写 Electron、Tarui 程序 -- HarmonyOS 附带了一个拓展版本的Node.js,UI可以通过它和原生模块交互,做过 Electron、Tarui 开发的朋友对此应该十分熟悉。

        这一迥异的开发体验背后是系统理念的差异。Windows 原生 C++ 开发程序员会有些抓瞎。

        有些同学会想,我不打算新学语言了,那么       

可以只用 C++ 开发程序吗?

        答案是:基本不能。

        首先是UI框架方面, HarmonyOS 定制了UI框架,这是为 ArkTs 定制的。C++和Java主要用于特定场景的开发​​,但无法完全替代ArkTS(尤其是界面开发)。

        因此,学习 ArkTS 是鸿蒙开发必备的基础。

ArkTS 难学吗?

        对前端,对熟悉 TypeScript ,尤其是熟悉 Electron、Tarui 开发的的同学来说应该是如鱼得水。对于 C++ 的同学,恐怕要经历一个不小的转型。除非你的目标仅仅是开发特定性能敏感模块的功能模块。

        不过仅仅就 ArkTS 语言来说,问题不大。尤其是我必须提一点,HarmonyOS 的文档教程十分的丰富详实,示例、练习题、视频课程应有尽有,有种在线辅助的贴心感👍。

        只要想学,肯定不难,尤其从 C++ 这种超级语法怪过来,会觉得轻松不少,更多的是开发范式的适应。 

        回过头来,我们看看 HarmonyOS 本身,抛开一些口水仗的问题,前面提到的系统理念差异具体是什么差异,华为为什么要推出新的系统,它新在哪里?
 

Windows 和 HarmonyOS 对比

先来对比下两个系统中的一些基础概念

系统核心概念映射表

Windows概念HarmonyOS对应概念重要差异说明
进程(Process)AbilityAbility是功能单元而非纯粹执行容器
窗口(Window)Component/Page鸿蒙采用声明式UI描述
注册表(Registry)Preferences/DataAbility分布式数据管理替代中心化配置
DLL动态库HAR静态包鸿蒙强调编译时确定依赖
Win32 APINative API鸿蒙API更面向服务化场景

        可见,在 HarmonyOS 中用户和开发人员已经远离了系统底层细节,UI是声明式的,数据是分布式的,系统功能是面向场景式的。

开发模式的区别

        传统的跨平台、多端的开发模式是为每一个系统环境使用独立的SDK,开发独立的APP,打独立的包。每个包最终是一个只包含对应端的独立实体。

        而HarmonyOS强调的是“一次开发, 多端部署”,即“一多开发”。因此,从项目工程管理、到界面布局到包的生成,都是一套。底层设备环境的差异被 HarmonyOS 抹平。

系统架构对比

Windows NT:集中式设计

经典的Windows NT架构紧凑致密:

  • 分层明确:用户态/内核态严格分离

  • 单体式内核:文件系统、设备驱动、安全机制等都运行在内核空间

  • 注册表中心化:系统配置高度集中

HarmonyOS架构:分布式设计

HarmonyOS则体现为分布式场景化:

  • 微内核设计:仅最基础的功能在内核中(任务调度、内存管理)

  • 服务组件化:文件系统、设备驱动等都作为独立服务运行在用户态

  • 无中心配置:采用分布式数据管理替代传统注册表

关键差异点

  • 模块耦合度:Windows各模块间调用关系复杂,鸿蒙通过IPC严格隔离

  • 扩展性:Windows依赖驱动模型,鸿蒙通过Ability动态加载

  • 安全性:鸿蒙的权限粒度更细,默认遵循最小权限原则

HarmonyOS 的全场景分布式特性

      

在HarmonyOS开发者文档上,多次提及到了多端、流转、分布式、场景化的字眼

        

        我们要重点要理解鸿蒙的"分布式"特点,这是最值得Windows开发者注意的差异点,我们从一个打开文件的操作来对比直观感受这个差异。

在Windows上:

// 传统Windows文件操作
var file = File.Open(@"C:\Users\Name\file.txt", FileMode.Open);

在HarmonyOS中可能是:

// 鸿蒙分布式文件访问
let fileAccessHelper = fileIO.createFileAccessHelper(context);
let file = await fileAccessHelper.openFile("deviceId://file.txt"); 

关键区别:

  1. 没有固定路径概念,而是通过统一资源标识符(URI)定位

  2. 自动处理设备间通信细节

  3. 异步操作是默认模式

开发思维转变

1. 从"设备为中心"到"场景为中心"

Windows开发通常假设:

  • 应用运行在单一设备上

  • 硬件配置相对固定

  • 网络连接是可选功能

鸿蒙开发需要假设:

  • 应用可能跨多个设备协同工作

  • 硬件能力动态变化(设备随时可能加入或离开)

  • 网络连接是基础能力

2. 生命周期管理的差异

Windows应用生命周期:

启动 → 运行 → 最小化/最大化 → 关闭

HarmonyOS Ability生命周期:

Create → Foreground → Background → Destroy↑___________↓     ↑______↓

特别注意

  • 鸿蒙应用更频繁地在前后台切换

  • 必须妥善处理状态保存/恢复

  • 后台运行有严格限制(与Windows服务概念不同)

为了更好的感受分布式特性,我们再次展示一个示例:


// 发现附近设备
import deviceManager from '@ohos.distributedDeviceManager';let deviceList = [];
const SUBSCRIBE_ID = 100;// 1. 创建设备管理器
let dmInstance = deviceManager.createDeviceManager("com.example.demo");// 2. 注册设备状态回调
dmInstance.on("deviceStateChange", (data) => {let device = data.device;if (data.action === 0) { // 设备上线deviceList.push(device);} else { // 设备离线deviceList = deviceList.filter(item => item.deviceId !== device.deviceId);}
});// 3. 开始发现设备
dmInstance.startDeviceDiscovery(SUBSCRIBE_ID);// 4. 选择设备后发送数据
async function sendData(deviceId, data) {let channel = await dmInstance.createDataChannel(deviceId);channel.send(data);
}

这个简单示例展示了:

  • 设备动态发现机制

  • 跨设备通信的抽象层

  • 响应式编程风格

给Windows开发者的特别提醒

  1. 线程模型差异

    • 不像Windows有丰富的线程优先级控制

    • Worker线程是主要的多任务手段

    • UI线程必须保持轻量

  2. 存储访问

    • 没有直接的"文件系统"概念

    • 使用DataAbility抽象数据源

    • 偏好使用分布式数据库

  3. 硬件交互

    • 通过服务Ability而非驱动

    • 需要动态检查能力可用性

    • 权限声明更严格

 回顾总结

       在 HarmonyOS 上开发,需要放弃经典的操作系统概念,开发细节远离底层,声明式UI,响应式编程,关注场景化,以及最重要的分布式,分布式,还是它X的分布式!


预告,下一篇我们将正式进入 HarmonyOS 应用开发,开启新的体验!

我对本系列的目标是,完成本系列后,将能够:

  • 理解HarmonyOS的核心设计理念

  • 熟练使用ArkTS/ETS进行应用开发

  • 掌握鸿蒙特有的分布式能力开发

  • 将Windows开发经验有效迁移到鸿蒙平台

  • 独立开发并发布完整的HarmonyOS应用


参考 

  • 所有HarmonyOS版本-版本说明 - 华为HarmonyOS开发者
  • 应用开发导读-基础入门 - 华为HarmonyOS开发者
  • 知识地图-HarmonyOS应用开发知识-华为开发者联盟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 事务管理与锁优化:确保数据一致性和并发性

在多用户并发访问的数据库系统中,如何确保数据的**一致性(Consistency)和并发性(Concurrency)**是一个核心挑战。**事务(Transaction)和锁(Lock)**是 MySQL 应对这一挑战的两大利器。事务保证了操作的原子性、一致性、隔离性和持久性,而锁机制则在并发环境下协调不同…

OpenPrompt 有没有实现连续提示词和提手动示词一起优化的

OpenPrompt 有没有实现连续提示词和提手动示词一起优化的 OpenPrompt 中连续提示词与手动提示词的混合优化 OpenPrompt 确实支持同时优化连续提示词(Soft Prompt)和手动设计的离散提示词(Manual Prompt)。这种混合优化策略可以结合两者的优势: 连续提示词:通过梯度下降…

Android添加语言列表

方式一 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java Settings.System.putString(context.getContentResolver(),Settings.System.SYSTEM_LOCALES, "ru-RU,en-US"); 方式2 packages/apps/Settings/src/co…

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法

subNvue,是 vue 页面的原生子窗体,把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面,它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件,就是一个原生子窗体。 …

如何保障服务器的安全

如何保障服务器的安全 以下是保障服务器安全的核心措施及实施建议: 一、基础设施层防护 物理安全 机房设置防火/防水/防雷系统,部署门禁监控设备。 服务器固定于抗震机架,避免物理损坏。 网络防护 防火墙规则:仅开放业务必要端…

C语言 学习 C程序的内存模型 2025年6月10日08:55:13

堆栈与内存管理 堆栈(Stack) : 后进先出(LIFO) 线性数据结构 包含压栈(Push) ,弹栈(Pop) 用途:临时存储数据(函数调用,局部变量) 管理:由系统自动分配和回收 速度快 ,容量有限! 堆栈代码示例: //堆栈示例 :局部变量 void getText() {int text20;//储存在堆栈中 } 内存管理…

CppCon 2015 学习:Implementing class properties effectively

这段内容讲的是C中“属性”(Property)的实现及其设计理念,并结合一个实际类Text来说明。中文理解如下: 关于“属性”(Property) 属性:介于类的字段(field)和方法&#…

[electron]预脚本不显示内联script

script-src self 是 Content Security Policy (CSP) 中的一个指令,它的作用是限制加载和执行 JavaScript 脚本的来源。 具体来说: self 表示 当前源。也就是说,只有来自当前网站或者当前页面所在域名的 JavaScript 脚本才被允许执行。"…

基于安卓的文件管理器程序开发研究源码数据库文档

摘 要 伴随着现代科技的发展潮流,移动互联网技术快速发展,各种基于通信技术的移动终端设备做的也越来越好了,现代智能手机大量的进入到了我们的生活中。电子产品的各种软硬技术技术的发展,操作系统的不断更新换代,谷歌…

MySQL主从复制实现指南

MySQL主从复制实现指南 一、主从复制原理 #mermaid-svg-i1zOswdD4OORQ35t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i1zOswdD4OORQ35t .error-icon{fill:#552222;}#mermaid-svg-i1zOswdD4OORQ35t .error-text…

spring jms使用

文章目录 一、背景介绍二、注意点说明三、代码pom.xmlmq.propertiesActiveMqConfigJmsSenderActiveMqInfoActivemqProtocolEnum生产者消费者 一、背景介绍 <dependency> 标签中列出的 spring-jms 是 Spring Framework 提供的一个模块&#xff0c;用于简化 Java Message …

笔记——学习HTTP协议

HTTP协议 文章目录 HTTP协议一、统一资源定位符&#xff08;url&#xff09;&#xff1a;URL编码格式&#xff1a; 二、HTTP报文结构&#xff1a;三、HTTP请求方法&#xff1a;四、HTTP常见请求头&#xff1a;五、HTTP状态码&#xff1a;六、HTTP常见响应头&#xff1a;七、HTT…

Unity中的Mathf.Clamp01

2025年6月8日&#xff0c;周日晚上 Mathf.Clamp01 是 Unity 中的一个数学函数&#xff0c;它的作用是将一个浮点数&#xff08;float&#xff09;限制在0 到 1的范围内。具体来说&#xff1a; 如果输入值 小于 0&#xff0c;则返回 0。 如果输入值 大于 1&#xff0c;则返回 1…

1 Studying《Linux Media Documentation》

目录 1 MEDIA SUBSYSTEM ADMIN AND USER GUIDE 1.1.2 Building support for a media device 1.1.3 Infrared remote control support in video4linux drivers 1.1.4 Digital TV 1.1.5 Cards List 1.1.5.2 PCI drivers 1.1.6 Video4Linux (V4L) driver-specifific docume…

编译原理 学习 2025年6月10日11:17:54

编译原理 将高级编程语言编写的源代码转换成机器可执行的代码(二进制或汇编代码) 核心任务: 词法分析(正则表达式和有限自动机): 示例Token分类&#xff1a;关键字&#xff1a;if, while 运算符&#xff1a;, 标识符&#xff1a;变量名 分解源代码为单词 识别 其中关键字 …

风中低语:Linux 信号处理的艺术与实践

文章目录 &#x1f307;前言&#x1f3d9;️正文1、信号的处理时机1.1、处理情况1.2、“合适” 的时机 2、用户态与内核态2.1、概念2.2、重谈进程地址空间2.3、信号的处理过程 3、信号的捕捉3.1、内核如何实现信号的捕捉&#xff1f;3.2、sigaction 4、信号部分小结 补充 5、可…

ASP.NET Core SignalR - 部分客户端消息发送

文章目录 前言一、消息发送的核心概念1.客户端标识2.消息接收范围 二、向特定用户发送消息管理员向指定用户发送私信&#xff0c;或用户之间一对一聊天。 三、向组发送消息聊天室、工作群组、通知订阅等。 四、广播消息系统公告、实时统计数据更新等。 五、向角色发送消息向管理…

前后端交互过程中—各类文件/图片的上传、下载、显示转换

前后端交互过程中—各类文件/图片的上传、下载、显示转换 图片上传下载常用函数&#xff1a;new Blob()**blobParts&#xff1a;&#xff08;必传&#xff09;****options&#xff1a;&#xff08;可选&#xff09;**blob的常见的MIME类型&#xff1a; URL.createObjectURL()替…

校园二手交易平台(微信小程序版)

文章目录 1. 项目概述2. 项目功能思维导图3. 技术架构1. 前端技术栈2. 后端技术栈 4. 核心模块实现5. 总结6. 项目实现效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 校园二手交易平台微信小程序旨在为在校学生提供一个便捷的二手物品交易渠道&#xff0c;包含用户模块…

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …