1.鸿蒙系统介绍
1.1官方定义
鸿蒙是一个全场景,面向未来的操作系统。
解释:
鸿蒙并不是一个单纯的手机操作系统,而是手机 + 智能设备的总称。可以安装在包括手机、手表、无人机等很多
- 设备上鸿蒙分为两类:
- 应用开发:也是整个鸿蒙的控制中心。(手机app)
开发语言:Java,js,C/C++(华为目前建议使用的还是Java)
内核:基于Linux内核开发的。
- 设备开发:也就是无人机,摄像机等硬件设备。
最合适的开发语言:C/C++
内核:基于LiteOS内核开发的。
于LiteOS的特点:轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年)。
鸿蒙系统可以覆盖所有的设备,应用在智能设备上,比如摄像头、门铃、体温计等设备。
利用软总线将各个设备连接起来。
1.1.1 官方网址:
1.1.2 鸿蒙的特点:
- one as all,all as one
HarmonyOS是新一代的智能终端操作系统,为不同设备的智能化、互联与协同提供了统一的语言。带来简洁、流畅、连续、安全可靠的全场景交互体验。
- 统一OS,弹性部署
一套操作系统,满足大大小小所有设备的需求,小到耳机,大到车机,智慧屏,手机等,让不同设备使用同一语言无缝沟通。
- 硬件互助,资源共享
搭载HarmonyOS 的每个设备都不是孤立的,在系统层让多终端融为一体,成为“超级终端”,终端之间能力互助共享,带来无缝协同体验。
- 一次开发,多端部署
开发者基于分布式应用框架,写一次逻辑代码,就可以部署在多种终端上。
- 应用自由跨端
HarmonyOS原子化服务是轻量化服务的新物种,它提供了全新的服务和交互方式,可分可合,可流转,支持免安装等特性,能够让应用化繁为简,让服务触手可及。
- 用“简单”激活你的设备智能
HarmonyOS是新一代智能终端操作系统。为不同设备的智能化、互联与协同提供了统一的语言。设备可实现一碰入网,无屏变有屏,操作可视化,一键直达原厂服务等全新功能。通过简单而智能的服务,实现设备智能化产业升级。
1.2 鸿蒙和安卓的对比
- 内核方面的对比
安卓系统是基于linux的宏内核设计 ,宏内核包含了操作系统绝大多数的功能和模块,而且这些功能和模块都具有最高的权限,只要一个模块出错,整个系统就会崩溃,这也是安卓系统容易崩溃的原因。好处就是系统开发难度低。
鸿蒙操作系统是微内核设计:微内核仅包括了操作系统必要的功能模块(任务管理、内存分配等)处在核心地位具有最高权限,其他模块不具有最高权限,也就是说其他模块出现问题,对于整个系统的运行是没有阻碍的。微内核稳定性很高。
而且鸿蒙系统包含了两个内核,如果是手机app是基于Linux内核,而如果是其他的硬件是基于LiteOS内核。
- 运行速度的对比
安卓程序不能与系统底层直接进行通信活动,是运行在虚拟机上的。如果虚拟机出了问题话的那系统就是卡住。
鸿蒙系统中的方舟编译器解决了这个问题的,任何由编译器编译的软件,是直接运行在操作系统中的,可以直接与系统底层进行通信。 - 作为手机操作系统的对比
安卓和鸿蒙都是基于安卓开源项目(AOSP)进行开发的。
而安卓开源平台是可以在开源许可下自由使用和修改的。国内外很多手机厂商都根据这套代码制定了自己的操作系统,比如:三星、小米、魅族等。而华为也是基于这套开源体系,制定了鸿蒙操作系统。
鸿蒙操作系统的构成:
HarmonyOS = 安卓开放平台的开源代码 - GMS - 安卓UI + HMS + 鸿蒙UI + 分布式软总线 + 以Ability为核心的应用开发框架。
- 连接其他设备的对比
安卓手机连接其他设备,不管从app开发方面,还有使用方面都非常麻烦,而且如果换一个第三方设备,还需要把发现,配对,连接,组合,验证的过程再次操作一遍。
但是鸿蒙就非常简单了,从app开发方面,只要写很少的代码就可以调用第三方硬件,从使用的角度来讲,不管是多少设备连在一起,鸿蒙的终极目标是都能像使用一台设备那样简单。
1.3 鸿蒙会取代安卓吗?
如果有的同学有这样的想法,那么格局太小了。针对于IT行业,一般来讲头部力量或者已经形成生态的东西,很难撼动他的地位。鸿蒙的出现并不是为了取代安卓,而是把眼光放在下下一个时代,也就是5G时代。在5G时代中,最重要的是万物互联的时代。华为是想要在5G时代占据主导权。
1.4几张图说明鸿蒙




1.5 为什么要学习鸿蒙开发?
开发者的角度:
安卓操作系统连接外部设备时,发现,配对,连接,组合,验证每一步都不能少。连接上了之后才能调用控制第三方设备。换一个设备之后,所有的代码需要重写。所有用安卓也可以连接外部设备并进行控制,但是太过于麻烦。而且不具备通用性。
鸿蒙操作系统就解决了这个痛点,设备与设备之间的连接就不需要我们开发者自己去写了,每一个设备都安装上鸿蒙操作系统之后,鸿蒙系统会通过软总线把这些设备都连接在一起。我们在应用开发的时候,只需要写很少的代码就可以调用第三方设备,就好像是使用手机本身的设备一样方便。
所以,在鸿蒙的整个体系中,手机不仅仅是手机了,而是一个超控控制终端。这个终端可能会有十个屏幕,十个喇叭等。调用手机本身的硬件跟调用外部的硬件几乎没有任何差别。
使用者的角度:
安卓操作系统中,所有的操作都是在手机上的,比如我们在导航的时候,都是用手机进行导航。但是在有的时候,我们是不方便拿着手机导航的,比如下雨天一个手撑伞一个手拎东西。
而在鸿蒙操作系统中,我们就可以把手机导航直接迁移到鸿蒙手表中就可以了。用户使用起来非常方便。
比如:我在A手机上编辑一封邮件的时候,需要添加一个excel附件。但是这个附件不在A手机上面,而是在B手机上面。传统做法要么就是从B手机上发过来,要么就是电脑复制文件,再粘贴过来,挺麻烦的。但是如果使用鸿蒙系统就方便了。我们可以直接数据迁移,把A手机里面编辑的邮件,迁移到B手机上。或者通过鸿蒙系统连上B手机之后直接使用B手机里面的附件。
除此之外,如果利用安卓操作系统控制硬件还需要下载很多的app,每一个app都有好几十兆,甚至上百兆。比如我要控制美的的冰箱,就需要下载一个app,要控制微波炉,又要下载一个app,如果我家里有100个电器,那么就要下载100个app,太麻烦了。在我们生活中,最烦的事情就是在手机中下载各种各样的app。而且下载完了之后,还需要扫描硬件,发现硬件,连接硬件,最后才能控制。
鸿蒙就为用户解决了这个问题,如果我们要控制冰箱,我们只要利用鸿蒙手机碰一下冰箱对应的芯片,那么鸿蒙手机就会到自己的应用中心,把控制冰箱的模块下载到手机里面然后直接打开控制中心,中间花费时间大约3秒左右,用户根本感觉不到下载和安装的过程。同理,如果我们要控制微波炉,也只要用手机碰一下微波炉对应的芯片,那么鸿蒙手机就会到自己的应用中心,把控制微波炉的模块下载到手机里面然后直接打开控制中心,对于用户来讲,非常的方便。所以鸿蒙一旦在市场铺开之后,用户用起来会非常的爽。
2.鸿蒙系统环境搭建
2.1开发流程
注册证号->实名认证->安装软件->编写代码->测试代码->发布应用
2.2 注册账号并实名认证
2.3鸿蒙开发的语言
- 工具名称:DevEco Studio
- 版本说明:
DevEco Studio 1.0 用于华为EMUI系统的应用App。
DevEco Studio 2.0 用于华为鸿蒙系统的应用App。 - 使用Java开发:
开发工具会帮我们自动下载JDK、展示界面以及开发工具等相关软件。所以我们不需要自己安装JDK等环境。 - JDK和工具链
JDK: 是Java语言所需要的开发环境。鸿蒙开发工具DevEco Studio会帮我们自动下载。鸿蒙开发工具目前只支持JDK8。
工具链:就是开发软件DevEco Studio里面需要用到的一些插件工具。
- Toolchains:SDK工具链,HarmonyOS应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合,首次下载SDK时默认下载。
- Previewer:Lite Wearable预览器,在开发过程中可以动态预览Lite Wearable应用的界面呈现效果,默认不自动下载,需手动勾选下载。
- 安装开发工具IDE
- 安装IDE时候的坑1:一直加载gradle
- 下载指定的gradle版本
可以到 官网下载或者借助网友提供的下载好的版本,直接下载使用。
- 下载指定的gradle版本
- 打开DevEco studio自动加载路径
默认在这个目录:C:\Users\Administrator.gradle\wrapper\dists\gradle-6.3-all\b4awcolw9l59x95tu1obfh9i8
- 打开DevEco studio自动加载路径
- 下载好的zip文件放进去
将下载好的gradle文件复制在以上文件夹内(注意一定要放置在类似“3221gyojl5jsh0helicew6rwx”目录下),重启软件即可。
- 下载好的zip文件放进去
- 修改模板
首先进入/plugins/harmony目录,这是DevEco Studio的插件目录。在该目录下继续找到
lib/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties文件,该文件就是每次创建HarmonyOS工程时的gradle-wrapper.properties文件,打开该文件,将distributionUrl改成http://127.0.0.1/gradle-6.3-all.zip 即可。然后重新启动DevEco Studio。
- 修改模板
- 安装IDE时候的坑2:模拟器刷不出来
开发应用的时候需要模拟器跑效果,需要在DevEco Studio菜单栏,点击Tools > HVD Manager开发模拟器,第一次打开,会自动下载相关资料。
注意1:浏览器一定要更新到最新版本,否则可能模拟器刷不出来。
目前亲测可用的浏览器有:chrom(谷歌)、火狐浏览器、360急速浏览器、360安全浏览器。
注意2:模拟器不是本地的,而是远程的,需要先登录才可以使用,登录的账号就是我们刚刚注册并实名认证的开发者账号。
注意3:模拟器启动之后只能用一小时,时间到了之后,关闭模拟器重新开启即可。
- 常见设置:
- 修改主题(setting->Appearance->Theme)
- 修改字体(setting->font)
- 修改注释字体(setting->Editor->color Scheme->Language Defaults->comments)
- 提示无关乎大小写(setting->Editor->General->Code Completion->去掉Match case)
- 自动导包(setting->Editor->General->auto import->勾选add un..以及optimize)
- 修改快捷键(setting->keyMap->code completion->Basic(提示)改成alt+/)
3.DevEco Studio项目结构
3.1最外面的结构:
MyApplication:整个项目的项目名
External Libraries:项目中要导入的第三方jar包
3.2MyApplication的结构:
展开MyApplication之后,发现很多目录,但是不是所有目录在开发中都需要经常用到的。
.gradle:是项目管理工具gradle的信息(一般是不会动)
.idea:是开发工具的信息(一般不会动)
entry:是应用主模块,在一个项目中,有且只有一个,所有的代码都在这个里面。(重要)
gradle:项目管理工具gradle的配置信息和所需要用到的jar包,在这个里面有一个properties的配置文件,可以看到gradle的版本号,一般我们会用默认的,也不会动
build.gradle:第三方jar包的配置文件,以后在开发中要用到第三方jar包需要在这个里面配置。
gradlew:是gradle命令工具对应的脚本文件,一般不用。一个是linux系统的,一个是windows系统的。
local.properties:本地SDK配置信息,一般也不动。
3.3entry的结构:
build:一般不会动,这个文件夹里面有一个R文件,记录每一个资源文件对应的id。里面的内容是自动生成的。
R文件是一个压缩包,里面装的ResourceTable这个类的字节码文件。
libs:第三方jar包存放的位置
src:主要代码
3.4src里面还有三个目录
main:是我们自己写的主要代码。
ohosTest:华为的测试工具。
test:是Junit的测试工具。
3.5main里面的结构目录:
我们自己写的代码就在main里面。
main里面主要分为三个部分:
- 在MyApplication中,我们暂时只要关心entry,这个里面是项目相关所有的资源文件和代码都在里面。
- 在entry中,主要知道libs和src即可。
- libs中存放第三方jar包 4. src中放主要代码
- 在src中的main是我们主要写的代码
- ohosTest是华为的测试代码
- test是Junit测试代码
- src中的main是我们写的所有代码
- src中的resources是我们写的所有界面的布局文件
- config.json里面配置了所有界面相关的信息
4.第一个入门应用Hello World
当新建完毕一个鸿蒙项目之后,自带有HelloWorld的代码。
所以,我们真正学习的是下面的四个知识点:
- 点击Tools下面的Device Manager 或者 项目右上角的用户头像即可登录。
- 选择Phone里面的P40,点击右侧的绿色三角启动模拟器
- 点击studio上方的绿色三角即可启动项目。
4.2页面中的包含关系
MainAbility是项目启动的第一个界面。
在界面里面不是直接显示内容的。在界面里面展示的是子界面,我们也称之为切片,或者片段。
在子界面里面才是显示内容的。
而展示的HelloWord是一段文本,这个文本就是放在MainAbilitySlice里面进行展示的。
关系如下:MainAbility (界面)包含一个或多个MainAbilitySlice(子界面)
MainAbilitySlice(子界面)包含要显示的内容
图解如下:

4.3 配置文件:config.json
所有的模块,界面等信息,都会在这个文件中进行配置。
鸿蒙应用启动之后,先解析config.json文件。
config.json:分为三个部分:(app 、deviceConfig 、module)
- app是整个项目的配置,包含了厂商信息、版本号等。
- deviceConfig:表示应用在设备上的配置信息。
1
比如:是否允许应用使用网络流量、是否支持在设备未解锁状态直接启动等
- module:表示整个代码的配置信息。
1
比如:程序在运行时候的所有界面,以及第一个要启动的界面是谁。
4.3.1app:
整个项目的配置信息
内容详解:
- bundleName包名
- vendor,是应用开发厂商的描述,也就是开发公司的名字。
- version:
包含:name、code。
4.3.2deviceConfig:
应用在设备上的配置信息 比如,应用需要获取手机里面的一些权限,就可以写在deviceConfig里面。如果不需要任何权限就可以空着不写。
4.3.3module:
代码中的配置信息
内容详解:
- package 包名
- name是hap包的名字
- mainAbility表示HAP包的入口ability名称
- deviceType表示项目可以在哪些设备上运行。
因为可能有多个设备,所以有个方括号,表示这些值可以写到一个数组中。 phone:手机 - distro表示HAP包的描述信息
- deliveryWithInstall 当前hap包是否可以支持随应用安装。一般都写成true。
- moduleName:当前HAP的名称
- moduleType:表示当前HAP的类型。entry也表示当前的hap是一个主要的模块,可以单独安装并运行
- abilities:代码中每一个页面的配置信息。
关于页面ability的配置,后面我们会详细讲解。4.4程序的启动过程
当程序刚开始启动的时候,会解析config.json中的信息,获取到第一个要加载的界面,也就是mainAbility,通过包名 + 类名定位到要运行的类MainAbility,所以界面启动,在这个界面里面又加载了MainAbilitySlice切片,在改切片中展示的内容为Layout包中的ability_main。

5.第二个鸿蒙入门应用-页面跳转
这种方式也是鸿蒙官方推荐的一个入门应用。
最终效果

设计思路:
第一步:在第一个界面中把HelloWorld改写为第一个界面,并添加一个按钮。
第二步:写第二个界面
第三步:书写跳转关系
5.1界面布局
鸿蒙UI中,提供了两种编写布局的方式:
在XML中声明UI布局
在代码中创建布局
这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单,以后开发中,也都是用XML布局的方式。
但是这两种方式都需要我们熟悉。所以,所以我们将通过XML的方式布局第一张页面,然后再通过代码的方式布局
第二张页面。
5.1.1 XML文件方式配置界面
- 打开layout下面的“ability_main.xml”文件
- 在“ability_main.xml”文件中创建一个文本Text和一个按钮Button
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<?xml version="1.0" encoding="utf-8"?>
<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:background_element="#000000">
<Text
ohos:id="$+id:text"
ohos:width="match_content" ohos:height="match_content" ohos:text="Hello World"
ohos:text_color="white"
ohos:text_size="32fp"
ohos:center_in_parent="true"/>
<Button ohos:id="$+id:button"
ohos:width="match_content"
ohos:height="match_content"
ohos:text="Next"
ohos:text_size="19fp"
ohos:text_color="white"
ohos:top_padding="8vp"
ohos:bottom_padding="8vp"
ohos:right_padding="80vp"
ohos:left_padding="80vp" ohos:background_element="$graphic:background_button" ohos:below="$id:text"
ohos:horizontal_center="true" />
</DependentLayout>
5.1.2 代码方式配置界面
- 创建Feature Ability
- 代码编写界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public class SecondAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
// 声明布局
DependentLayout myLayout = new DependentLayout(this);
// 设置页面布局大小和背景色
myLayout.setWidth(MATCH_PARENT);
myLayout.setHeight(MATCH_PARENT);
ShapeElement element = new ShapeElement();
element.setRgbColor(new RgbColor(255, 255, 255));
myLayout.setBackground(element);
// 创建一个文本
Text text = new Text(this);
text.setText("Nice to meet you.");
text.setTextSize(55);
text.setTextColor(Color.BLACK);
// 设置文本的布局
DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(MATCH_CONTENT,MATCH_CONTENT);
textConfig.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT);
text.setLayoutConfig(textConfig);
myLayout.addComponent(text);
super.setUIContent(myLayout);
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
} }5.2 代码实现页面跳转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener { Button button;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
button = (Button) findComponentById(ResourceTable.Id_text_button);
button.setClickedListener(this);
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) { super.onForeground(intent);
}
@Override
public void onClick(Component component) {
if(component == button){
//跳转页面
//创建一个意图对象。
Intent i = new Intent();
//创建意图的参数对象。
Operation operation = new Intent.OperationBuilder() .withDeviceId("")//本机 .withBundleName("com.example.myapplication")//哪个应用 .withAbilityName("com.example.myapplication.Second_Ability")//哪个界面
.build();
i.setOperation(operation);
startAbility(i);
}
}
}