鸿蒙初体验:从安装到第一个程序 Hello HarmonyOS

Source

华为鸿蒙OS 2.0就不多介绍了
更多关于JS API的写法可以参考:
鸿蒙初体验(二):使用JS FA应用的chart组件画一个简单线性图
鸿蒙初体验(三):使用JS FA应用写一个简单的猜数字游戏

一、源码和应用下载地址

鸿蒙的源码地址:https://openharmony.gitee.com
华为开发者联盟:https://developer.huawei.com/consumer/cn
官方文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-layout-dependentlayout-0000001050729536
开发应用下载:https://developer.harmonyos.com/cn/develop/deveco-studio#download

二、安装与运行

1.运行环境要求

DevEco Studio只支持Windows版本,为保证DevEco Studio正常运行,建议您的电脑配置满足如下要求:

  • 操作系统:Windows10 64位
  • 内存:8GB及以上
  • 硬盘:100GB及以上
  • 分辨率:1280*800像素及以上

在这里插入图片描述

目前DevEco Studio 2.0才支持HarmonyOS开发,DevEco Studio 1.0暂不支持

2.下载和安装Node.js

Node.js软件仅在使用到JS语言开发HarmonyOS应用时才需要安装。使用其它语言开发,不用安装Node.js,请跳过此章节。

登录Node.js官方网站,下载Node.js软件包。请选择LTS版本,Windows 64位对应的软件包。
在这里插入图片描述
点击下载后的软件包进行安装,全部按照默认设置点击Next,直至Finish。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。

3.安装和运行DevEco Studio 2.0

开发应用下载:https://developer.harmonyos.com/cn/develop/deveco-studio#download

DevEco Studio的编译构建依赖JDK,DevEco Studio预置了Open JDK,版本为1.8,安装过程中会自动安装JDK。

在这里插入图片描述

安装完成启动会提示下载SDK,点击取消,搜索SDK,重新自定义SDK路径。在这里插入图片描述
三、第一个项目 Hello HarmonyOS

  1. 打开DevEco Studio,在欢迎页点击Create HarmonyOS Project,创建一个新工程。

在这里插入图片描述

  1. 可以看到这里有三种类型选择,我们选择TV版的Empty Feature Ability(Java),点击Next。

  2. 填写项目相关信息,保持默认值即可,点击Finish。
    首次创建工程时,会自动下载Gradle工具(Gradle下载失败如何解决?),时间较长,请耐心等待。
    在这里插入图片描述

  3. 在DevEco Studio菜单栏,点击Tools > HVD Manager。首次使用模拟器,需下载模拟器相关资源,请点击OK,等待资源下载完成后,点击模拟器界面左下角的Refresh按钮。(查看使用远程模拟器的常见问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 在浏览器中弹出华为帐号登录界面,请输入已实名认证的华为帐号的用户名和密码进行登录。
    在这里插入图片描述

推荐使用Chrome浏览器,如果使用Safari、360等其他浏览器,要取消阻止跨站跟踪和阻止所有Cookie功能。

  1. 登录后,请点击界面的允许按钮进行授权。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
运行成功如上图所示

三、我的第一个页面

下面我们用XML的方式编写了一个包含文本和按钮的页面。

  1. 在“Project”窗口,打开“entry > src > main > resources > base”,右键点击“base”文件夹,选择“New > Directory”,命名为“layout”。在这里插入图片描述
  2. 右键点击“layout”文件夹,选择“New > File”,命名为“main_layout.xml”。在这里插入图片描述
  3. 打开“main_layout.xml”文件,添加一个文本和一个按钮,示例代码如下:
<?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="#ffffff">
    <Text
            ohos:id="$+id:text"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:center_in_parent="true"
            ohos:text="Hello HarmonyOS"
            ohos:text_color="#000000"
            ohos:text_size="32fp"/>
    <Button
            ohos:id="$+id:button"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text_size="19fp"
            ohos:text="进入"
            ohos:top_padding="8vp"
            ohos:bottom_padding="8vp"
            ohos:right_padding="80vp"
            ohos:left_padding="80vp"
            ohos:text_color="white"
            ohos:background_element="$graphic:button_element"
            ohos:center_in_parent="true"
            ohos:align_parent_bottom="true"/>
</DependentLayout>
  1. 上述按钮的背景是通过“button_element”来显示的,需要在“base”目录下创建“graphic”文件夹,在“graphic”文件夹中新建一个“button_element.xml”文件。
    在这里插入图片描述
    在这里插入图片描述
<?xml version="1.0" encoding="utf-8"?>
<shape
        xmlns:ohos="http://schemas.huawei.com/res/ohos"
        ohos:shape="oval">
    <solid
            ohos:color="#007DFF"/>
</shape>

如果DevEco Studio提示xmlns字段错误,请忽略,不影响后续操作。

  1. 在“Project”窗口中,选择“entry > src > main > java > com.example.helloworld > slice” ,打开“MainAbilitySlice.java”文件。重写onStart()方法加载XML布局,示例代码如下:
package com.example.myapplication.slice;
 
import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
 
public class MainAbilitySlice extends AbilitySlice {
    
      
 
    @Override
    public void onStart(Intent intent) {
    
      
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_main_layout); // 加载XML布局
    }
 
    @Override
    public void onActive() {
    
      
        super.onActive();
    }
 
    @Override
    public void onForeground(Intent intent) {
    
      
        super.onForeground(intent);
    }
}

效果图如下
在这里插入图片描述

四、我的第二个页面

这里用创建布局的方式,来编写我的第二个页面。

  1. 在“Project”窗口,打开“entry > src > main > java”,右键点击“com.example.myapplication”文件夹,选择“New > Ability > Empty Feature Ability(Java)”。

配置Ability时,将“Page Name”设置为“SecondAbility”,点击“Finish”。创建完成后,可以看到新增了“SecondAbility”和“SecondAbilitySlice”文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 编写SecondAbilitySlice文件
package com.example.myapplication.slice;
 
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.DependentLayout;
import ohos.agp.components.DependentLayout.LayoutConfig;
import ohos.agp.components.Text;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
 
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
 
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("页面跳转成功");
        text.setTextColor(Color.BLUE);
        text.setWidth(MATCH_PARENT);
        text.setTextSize(55);
        // 设置文本的布局
        DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(MATCH_CONTENT,MATCH_CONTENT);
        textConfig.addRule(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);
    }
}

在这里插入图片描述

五、实现页面跳转

打开第一个页面的“MainAbilitySlice.java”文件,重写onStart()方法添加按钮的响应逻辑,实现点击按钮跳转到下一页,示例代码如下:

package com.example.myapplication.slice;
 
import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.*;
 
public class MainAbilitySlice extends AbilitySlice {
    
      
 
    @Override
    public void onStart(Intent intent) {
    
      
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_main_layout);
        Button button = (Button) findComponentById(ResourceTable.Id_button);
 
        if (button != null) {
    
      
            // 为按钮设置点击回调
            button.setClickedListener(new Component.ClickedListener() {
    
      
                @Override
                public void onClick(Component component) {
    
      
                Intent secondIntent = new Intent();
                // 指定待启动FA的bundleName和abilityName
                Operation operation = new Intent.OperationBuilder()
                        .withDeviceId("")
                        .withBundleName("com.example.myapplication")
                        .withAbilityName("com.example.myapplication.SecondAbility")
                        .build();
                secondIntent.setOperation(operation);
                startAbility(secondIntent); // 通过AbilitySlice的startAbility接口实现启动另一个页面
                }
            });
        }
    }
 
    @Override
    public void onActive() {
    
      
        super.onActive();
    }
 
    @Override
    public void onForeground(Intent intent) {
    
      
        super.onForeground(intent);
    }
}

就可以通过点击第一个页面的“进入”来到第二个页面了

六、文档学习

我们可以通过HarmonyOS的API文档进行学习和高效开发
这里以Java API为例,修改一下我的第二个页面SecondAbilitySlice

进入文档,我们打开“Java API> ohos.agp.components> class> TickTimer”

TickTimer顾名思义也就是计时器啦

在这里插入图片描述
在这里插入图片描述
往下滑可以看到他已经实现的方法
在这里插入图片描述
修改SecondAbilitySlice

package com.example.myapplication.slice;
 
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.DependentLayout;
import ohos.agp.components.DependentLayout.LayoutConfig;
import ohos.agp.components.Text;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
 
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
 
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("页面跳转成功");
        text.setTextColor(Color.BLACK);
        text.setWidth(MATCH_PARENT);
        text.setTextSize(55);
        // 创建一个计时器
        TickTimer tickTimer = new TickTimer(this);
        tickTimer.start();
        // 设置文本的布局
        DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(MATCH_CONTENT,MATCH_CONTENT);
        textConfig.addRule(LayoutConfig.ALIGN_PARENT_BOTTOM);
        text.setLayoutConfig(textConfig);
        myLayout.addComponent(text);
        // 设置计时器的布局
        textConfig.addRule(LayoutConfig.CENTER_IN_PARENT);
        tickTimer.setLayoutConfig(textConfig);
        myLayout.addComponent(tickTimer);
 
        super.setUIContent(myLayout);
    }
 
    @Override
    public void onActive() {
    
      
        super.onActive();
    }
 
    @Override
    public void onForeground(Intent intent) {
    
      
        super.onForeground(intent);
    }
}

在这里插入图片描述
如果不熟悉Java写法的可以从JS API开始

更多关于JS API的写法可以参考:
鸿蒙初体验(二):使用JS FA应用的chart组件画一个简单线性图
鸿蒙初体验(三):使用JS FA应用写一个简单的猜数字游戏

在这里插入图片描述
官方文档写得很清楚,而且是中文的,学起来也很方便

七、总结

HarmonyOS总体语法还是和安卓相似的,学习安卓的同学可以了解一下。

目前HarmonyOS应用的领域还是TV端和Wearable端,听过明年有希望安装在华为手机上成为手机系统。

HarmonyOS2.0发布会指出HarmonyOS2.0拥有跨设备、服务流转、极速直达、可视可说等特性。

发展趋势毋庸置疑,还是5G和物联网。

虽然目前鸿蒙OS2.0对比苹果iOS和谷歌安卓还是略低一筹,也还没应用在手机端不过据说HarmonyOS2.0已经达到安卓的70%到80%水平。

鸿蒙系统并不是基于安卓系统开发,而是一个全新、基于5G物联网技术构建独立操作系统,并且还能兼容安卓,对安卓开发者也十分的和谐。

同时,谷歌正在开发自己的 fuchsia的新系统,也是应用于5G和物联网。
换言之,安卓是4G时代的产物,鸿蒙要对标的不是安卓,而是同样基于5G应用和物联网时代开发的谷歌 fuchsia系统。

1+8+n,万物互联,指日可待!

以上就是我这段时间的摸索过程,和所思所想,希望能帮助你了解HarmonyOS2.0,也欢迎感兴趣的小伙伴一起交流学习。