01鸿蒙(HarmonyOS)应用开发入门


1.鸿蒙系统介绍

1.1官方定义

  • 鸿蒙是一个全场景,面向未来的操作系统。

  • 解释:

鸿蒙并不是一个单纯的手机操作系统,而是手机 + 智能设备的总称。可以安装在包括手机、手表、无人机等很多

  • 设备上鸿蒙分为两类:
  1. 应用开发:也是整个鸿蒙的控制中心。(手机app)

开发语言:Java,js,C/C++(华为目前建议使用的还是Java)

内核:基于Linux内核开发的。

  1. 设备开发:也就是无人机,摄像机等硬件设备。

最合适的开发语言:C/C++

内核:基于LiteOS内核开发的。

于LiteOS的特点:轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年)。

鸿蒙系统可以覆盖所有的设备,应用在智能设备上,比如摄像头、门铃、体温计等设备。

利用软总线将各个设备连接起来。

1.1.1 官方网址:

https://www.harmonyos.com

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几张图说明鸿蒙

image-20210808110213386

image-20210808110236988

image-20210808110259436

image-20210808110315222

1.5 为什么要学习鸿蒙开发?

开发者的角度:

安卓操作系统连接外部设备时,发现,配对,连接,组合,验证每一步都不能少。连接上了之后才能调用控制第三方设备。换一个设备之后,所有的代码需要重写。所有用安卓也可以连接外部设备并进行控制,但是太过于麻烦。而且不具备通用性。

鸿蒙操作系统就解决了这个痛点,设备与设备之间的连接就不需要我们开发者自己去写了,每一个设备都安装上鸿蒙操作系统之后,鸿蒙系统会通过软总线把这些设备都连接在一起。我们在应用开发的时候,只需要写很少的代码就可以调用第三方设备,就好像是使用手机本身的设备一样方便。

所以,在鸿蒙的整个体系中,手机不仅仅是手机了,而是一个超控控制终端。这个终端可能会有十个屏幕,十个喇叭等。调用手机本身的硬件跟调用外部的硬件几乎没有任何差别。

使用者的角度:

安卓操作系统中,所有的操作都是在手机上的,比如我们在导航的时候,都是用手机进行导航。但是在有的时候,我们是不方便拿着手机导航的,比如下雨天一个手撑伞一个手拎东西。

而在鸿蒙操作系统中,我们就可以把手机导航直接迁移到鸿蒙手表中就可以了。用户使用起来非常方便。

比如:我在A手机上编辑一封邮件的时候,需要添加一个excel附件。但是这个附件不在A手机上面,而是在B手机上面。传统做法要么就是从B手机上发过来,要么就是电脑复制文件,再粘贴过来,挺麻烦的。但是如果使用鸿蒙系统就方便了。我们可以直接数据迁移,把A手机里面编辑的邮件,迁移到B手机上。或者通过鸿蒙系统连上B手机之后直接使用B手机里面的附件。

除此之外,如果利用安卓操作系统控制硬件还需要下载很多的app,每一个app都有好几十兆,甚至上百兆。比如我要控制美的的冰箱,就需要下载一个app,要控制微波炉,又要下载一个app,如果我家里有100个电器,那么就要下载100个app,太麻烦了。在我们生活中,最烦的事情就是在手机中下载各种各样的app。而且下载完了之后,还需要扫描硬件,发现硬件,连接硬件,最后才能控制。

鸿蒙就为用户解决了这个问题,如果我们要控制冰箱,我们只要利用鸿蒙手机碰一下冰箱对应的芯片,那么鸿蒙手机就会到自己的应用中心,把控制冰箱的模块下载到手机里面然后直接打开控制中心,中间花费时间大约3秒左右,用户根本感觉不到下载和安装的过程。同理,如果我们要控制微波炉,也只要用手机碰一下微波炉对应的芯片,那么鸿蒙手机就会到自己的应用中心,把控制微波炉的模块下载到手机里面然后直接打开控制中心,对于用户来讲,非常的方便。所以鸿蒙一旦在市场铺开之后,用户用起来会非常的爽。

2.鸿蒙系统环境搭建

2.1开发流程

注册证号->实名认证->安装软件->编写代码->测试代码->发布应用
image-20210808132621623

2.2 注册账号并实名认证

鸿蒙官网

2.3鸿蒙开发的语言

  1. java(应用主流)
  2. js
  3. c/c++ (硬件主流)
  4. 仓颉

    2.4开发工具

  • 工具名称:DevEco Studio
  • 版本说明:
    DevEco Studio 1.0 用于华为EMUI系统的应用App。
    DevEco Studio 2.0 用于华为鸿蒙系统的应用App。
  • 使用Java开发:
    开发工具会帮我们自动下载JDK、展示界面以及开发工具等相关软件。所以我们不需要自己安装JDK等环境。
  • JDK和工具链
    JDK: 是Java语言所需要的开发环境。鸿蒙开发工具DevEco Studio会帮我们自动下载。鸿蒙开发工具目前只支持JDK8。
    工具链:就是开发软件DevEco Studio里面需要用到的一些插件工具。
  1. Toolchains:SDK工具链,HarmonyOS应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合,首次下载SDK时默认下载。
  2. Previewer:Lite Wearable预览器,在开发过程中可以动态预览Lite Wearable应用的界面呈现效果,默认不自动下载,需手动勾选下载。
  • 安装开发工具IDE
  1. 安装IDE时候的坑1:一直加载gradle
    1. 下载指定的gradle版本
      可以到 官网下载或者借助网友提供的下载好的版本,直接下载使用。
    1. 打开DevEco studio自动加载路径
      默认在这个目录:C:\Users\Administrator.gradle\wrapper\dists\gradle-6.3-all\b4awcolw9l59x95tu1obfh9i8
    1. 下载好的zip文件放进去
      将下载好的gradle文件复制在以上文件夹内(注意一定要放置在类似“3221gyojl5jsh0helicew6rwx”目录下),重启软件即可。
    1. 修改模板
      首先进入/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。
  2. 安装IDE时候的坑2:模拟器刷不出来
    开发应用的时候需要模拟器跑效果,需要在DevEco Studio菜单栏,点击Tools > HVD Manager开发模拟器,第一次打开,会自动下载相关资料。
    注意1:浏览器一定要更新到最新版本,否则可能模拟器刷不出来。
    目前亲测可用的浏览器有:chrom(谷歌)、火狐浏览器、360急速浏览器、360安全浏览器。
    注意2:模拟器不是本地的,而是远程的,需要先登录才可以使用,登录的账号就是我们刚刚注册并实名认证的开发者账号。
    注意3:模拟器启动之后只能用一小时,时间到了之后,关闭模拟器重新开启即可。
  • 常见设置:
  1. 修改主题(setting->Appearance->Theme)
  2. 修改字体(setting->font)
  3. 修改注释字体(setting->Editor->color Scheme->Language Defaults->comments)
  4. 提示无关乎大小写(setting->Editor->General->Code Completion->去掉Match case)
  5. 自动导包(setting->Editor->General->auto import->勾选add un..以及optimize)
  6. 修改快捷键(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里面主要分为三个部分:

  • java:里面是我们写的所有代码。
  • resources:里面是我们跟界面相关的资源文件。
  • config.json:是界面相关所有配置信息,每一个界面都需要在这个里面进行配置。

    小结:

  1. 在MyApplication中,我们暂时只要关心entry,这个里面是项目相关所有的资源文件和代码都在里面。
  2. 在entry中,主要知道libs和src即可。
  3. libs中存放第三方jar包 4. src中放主要代码
  4. 在src中的main是我们主要写的代码
  5. ohosTest是华为的测试代码
  6. test是Junit测试代码
  7. src中的main是我们写的所有代码
  8. src中的resources是我们写的所有界面的布局文件
  9. config.json里面配置了所有界面相关的信息

4.第一个入门应用Hello World

当新建完毕一个鸿蒙项目之后,自带有HelloWorld的代码。
所以,我们真正学习的是下面的四个知识点:

  • 如何运行项目
  • 页面中的包含关系
  • 配置文件:config.json
  • 了解程序的启动流程

    4.1 如何运行项目

  • 登录账号
  • 选择并开启模拟器
  • 运行项目
    分步操作:
  1. 点击Tools下面的Device Manager 或者 项目右上角的用户头像即可登录。
  2. 选择Phone里面的P40,点击右侧的绿色三角启动模拟器
  3. 点击studio上方的绿色三角即可启动项目。

    4.2页面中的包含关系

    MainAbility是项目启动的第一个界面。
    在界面里面不是直接显示内容的。在界面里面展示的是子界面,我们也称之为切片,或者片段。
    在子界面里面才是显示内容的。
    而展示的HelloWord是一段文本,这个文本就是放在MainAbilitySlice里面进行展示的。
    关系如下:

    MainAbility (界面)包含一个或多个MainAbilitySlice(子界面)
    MainAbilitySlice(子界面)包含要显示的内容

图解如下:

image-20210808165312093

4.3 配置文件:config.json

所有的模块,界面等信息,都会在这个文件中进行配置。
鸿蒙应用启动之后,先解析config.json文件。
config.json:分为三个部分:(app 、deviceConfig 、module)

  • app是整个项目的配置,包含了厂商信息、版本号等。
  • deviceConfig:表示应用在设备上的配置信息。
    1
    比如:是否允许应用使用网络流量、是否支持在设备未解锁状态直接启动等
  • module:表示整个代码的配置信息。
    1
    比如:程序在运行时候的所有界面,以及第一个要启动的界面是谁。

    4.3.1app:

    整个项目的配置信息
    内容详解:
  1. bundleName包名
  2. vendor,是应用开发厂商的描述,也就是开发公司的名字。
  3. version:
    包含:name、code。

4.3.2deviceConfig:

应用在设备上的配置信息 比如,应用需要获取手机里面的一些权限,就可以写在deviceConfig里面。如果不需要任何权限就可以空着不写。

4.3.3module:

代码中的配置信息
内容详解:

  1. package 包名
  2. name是hap包的名字
  3. mainAbility表示HAP包的入口ability名称
  4. deviceType表示项目可以在哪些设备上运行。
    因为可能有多个设备,所以有个方括号,表示这些值可以写到一个数组中。 phone:手机
  5. distro表示HAP包的描述信息
  6. deliveryWithInstall 当前hap包是否可以支持随应用安装。一般都写成true。
  7. moduleName:当前HAP的名称
  8. moduleType:表示当前HAP的类型。entry也表示当前的hap是一个主要的模块,可以单独安装并运行
  9. abilities:代码中每一个页面的配置信息。
    关于页面ability的配置,后面我们会详细讲解。

    4.4程序的启动过程

    当程序刚开始启动的时候,会解析config.json中的信息,获取到第一个要加载的界面,也就是mainAbility,通过包名 + 类名定位到要运行的类MainAbility,所以界面启动,在这个界面里面又加载了MainAbilitySlice切片,在改切片中展示的内容为Layout包中的ability_main。

image-20210808170111670

5.第二个鸿蒙入门应用-页面跳转

这种方式也是鸿蒙官方推荐的一个入门应用。
最终效果

image-20210809173905431

设计思路:
第一步:在第一个界面中把HelloWorld改写为第一个界面,并添加一个按钮。
第二步:写第二个界面
第三步:书写跳转关系

5.1界面布局

鸿蒙UI中,提供了两种编写布局的方式:

  • 在XML中声明UI布局

  • 在代码中创建布局

这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单,以后开发中,也都是用XML布局的方式。

但是这两种方式都需要我们熟悉。所以,所以我们将通过XML的方式布局第一张页面,然后再通过代码的方式布局

第二张页面。

5.1.1 XML文件方式配置界面

  1. 打开layout下面的“ability_main.xml”文件
  2. 在“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 代码方式配置界面

  1. 创建Feature Ability
  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
    29
    30
    31
    32
    33
    public 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
    29
    public 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);
    }
    }
    }

文章作者: 哈雅布撒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 哈雅布撒 !
  目录