使用Java开发HarmonyOS

开发准备

在这里插入图片描述

本文适用于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转功能的应用(如下图预览器运行效果所示),熟悉HarmonyOS应用开发流程。

HarmonyOS提供了两种FA(Feature Ability)的UI开发框架:Java UI框架和JS UI框架。

Java UI框架提供了细粒度的UI编程接口,UI元素更丰富,使应用开发更加灵活。
JS UI框架提供了相对高层的UI描述,使应用开发更加简单。

官网文档详细介绍

但其实有过Java基础的,上手肯定是容易一些的,

配置开发环境

下载&更新HarmonyOS SDK

DevEco Studio提供SDK Manager统一管理SDK及工具链,下载各种编程语言的SDK包时,SDK Manager会自动下载该SDK包依赖的工具链。

SDK Manager提供多种编程语言的SDK包和工具链,具体说明请参考下表。

下载HarmonyOS SDK

第一次使用DevEco Studio,需要下载HarmonyOS SDK及对应工具链。
说明

HarmonyOS SDK与OpenHarmony SDK不兼容,下载的HarmonyOS SDK并不适用于OpenHarmony工程。加载OpenHarmony SDK和开发OpenHarmony应用,请参考OpenHarmony使用指南。

1.运行已安装的DevEco Studio,首次使用,请选择Do not import settings,点击OK。
2.进入配置向导页面,设置npm registry,DevEco Studio已预置对应的仓,直接点击Start using DevEco Studio进入下一步。
说明

如果配置向导界面出现的是设置Set up HTTP Proxy界面,说明网络受限,请根据参考信息配置DevEco Studio代理、NPM代理和Gradle代理后,再下载HarmonyOS SDK。

在这里插入图片描述

3.通过DevEco Studio向导指引开发者下载HarmonyOS SDK,默认情况下,SDK会下载到user目录下,也可以指定对应的存储路径,SDK存储路径不支持中文字符,然后点击Next。


在这里插入图片描述

4.默认会下载最新版本的Java SDK、JS SDK、Previewer和Toolchains。在弹出的License Agreement窗口,点击Accept开始下载SDK。
说明

下载SDK过程中,如果出现下载JS SDK失败,提示“Install js dependencies failed.”,请根据JS SDK安装失败处理指导进行处理。
5.等待HarmonyOS SDK及工具下载完成,点击Finish,界面会进入到DevEco Studio欢迎页。


在这里插入图片描述

SDK默认只会下载最新版本的Java SDK、JS SDK、Previewer和Toolchains,点击上图欢迎页中的Configure(或图标) > Settings,进入HarmonyOS SDK页面,可以下载其它组件,只需要勾选对应的组件包,然后点击Apply即可。
更新HarmonyOS SDK

如果已经下载过HarmonyOS SDK,当存在新版本的SDK时,可以通过SDK Manager来更新对应的SDK。进入SDK Manager的方法:

在DevEco Studio欢迎页,点击Configure(或图标) > Settings > HarmonyOS SDK进入SDK Manager界面(macOS系统为Configure > Preferences > HarmonyOS SDK)。
在DevEco Studio打开工程的情况下,点击Tools > SDK Manager界面进入;或者点击Files > Settings > HarmonyOS SDK进入(macOS系统为DevEco Studio > Preferences > HarmonyOS SDK)。

在SDK Manager中,勾选需要更新的SDK,然后点击Apply,然后在弹出的确认更新窗口,点击OK即可开始更新。


在这里插入图片描述

配置HDC工具环境变量

HDC是为开发者提供HarmonyOS应用的调试工具,为方便使用HDC工具,请为HDC工具的端口号设置环境变量。

Windows环境变量设置方法:

在此电脑 > 属性 > 高级系统设置 > 高级 > 环境变量中,添加HDC端口变量。变量名为:HDC_SERVER_PORT,变量值设置为7035。

[图片上传失败...(image-f7a5aa-1625060806574)]

环境变量配置完成后,关闭并重启DevEco Studio。

macOS环境变量设置方法:

打开终端工具,执行以下命令,打开.bash_profile文件。

    vi ./.bash_profile

点击字母“i”,进入Insert模式。
输入以下内容,添加HDC_SERVER_PORT环境变量信息。

    HDC_SERVER_PORT=7035
    launchctl setenv HDC_SERVER_PORT $HDC_SERVER_PORT
    export HDC_SERVER_PORT

编辑完成后,点击“Esc”键,退出编辑模式,然后输入:wq,点击Enter按钮保存。
执行以下命令,使配置的环境变量生效。

    source .bash_profile

环境变量配置完成后,关闭并重启DevEco Studio。

参考信息

DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用。

一般来说,如果使用的是个人或家庭网络,是不需要设置代理信息的;只有部分企业网络受限的情况下,才需要设置代理信息。

如果是第一次打开DevEco Studio,配置向导界面出现设置Set up HTTP Proxy界面,说明网络受限,可以通过配置代理的方式来解决,需要配置DevEco Studio代理、NPM代理和Gradle代理。


在这里插入图片描述

设置Gradle代理

打开“此电脑”,在文件夹地址栏中输入%userprofile%(Mac系统请点击前往 > 个人),进入个人用户界面。

在这里插入图片描述

创建一个文件夹,命名为.gradle。如果已有.gradle文件夹,请跳过此操作。
说明

macOS系统创建.gradle文件夹前,请将系统设置为“显示隐藏文件”。
进入.gradle文件夹,新建一个文本文档,命名为gradle,并修改后缀为.properties。
打开gradle.properties文件中,添加如下脚本,然后保存。
其中代理服务器、端口、用户名、密码和不使用代理的域名,请根据实际代理情况进行修改。其中不使用代理的“nonProxyHosts”的配置间隔符是 “|”。

    systemProp.http.proxyHost=proxy.server.com
    systemProp.http.proxyPort=8080
    systemProp.http.nonProxyHosts=*.company.com|10.*|100.*
    systemProp.http.proxyUser=userId
    systemProp.http.proxyPassword=password
    systemProp.https.proxyHost=proxy.server.com
    systemProp.https.proxyPort=8080
    systemProp.https.nonProxyHosts=*.company.com|10.*|100.*
    systemProp.https.proxyUser=userId
    systemProp.https.proxyPassword=password

编写第一个页面

在Java UI框架中,提供了两种编写布局的方式:在XML中声明UI布局和在代码中创建布局。这两种方式创建出的布局没有本质差别,为了熟悉两种方式,我们将通过XML的方式编写第一个页面,通过代码的方式编写第二个页面。

在“Project”窗口,点击“entry > src > main > resources > base > layout”,打开“ability_main.xml”文件。


在这里插入图片描述
第一个页面内有一个文本和一个按钮,使用DependentLayout布局,通过Text和Button组件来实现,其中vp和fp分别表示虚拟像素和字体像素。“ability_main.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">
        <Text
            ohos:id="$+id:text"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text="Hello World"
            ohos:text_color="#000000"
            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="#FFFFFF"
            ohos:top_padding="8vp"
            ohos:bottom_padding="8vp"
            ohos:right_padding="70vp"
            ohos:left_padding="70vp"
            ohos:center_in_parent="true"
            ohos:below="$id:text"
            ohos:margin="10vp"/>
    </DependentLayout>

按钮的背景是蓝色胶囊样式,可以通过graphic目录下的XML文件来设置。

右键点击“graphic”文件夹,选择“New > File”,命名为“background_button.xml”,单击回车键。


在这里插入图片描述
“background_button.xml”的示例代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:ohos="http://schemas.huawei.com/res/ohos"
        ohos:shape="rectangle">
        <corners
            ohos:radius="100"/>
        <solid
            ohos:color="#007DFF"/>
    </shape>

在layout目录下的“ability_main.xml”文件中,使用background_element="$graphic:background_button"的方式引用“background_button.xml”文件:

    <?xml version="1.0" encoding="utf-8"?>
    <DependentLayout
        ...
        <Button
            ohos:id="$+id:button"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:text="Next"
            ohos:text_size="19fp"
            ohos:text_color="#FFFFFF"
            ohos:top_padding="8vp"
            ohos:bottom_padding="8vp"
            ohos:right_padding="70vp"
            ohos:left_padding="70vp"
            ohos:center_in_parent="true"
            ohos:below="$id:text"
            ohos:margin="10vp"
            ohos:background_element="$graphic:background_button"/>
    </DependentLayout>

在XML文件中添加组件后,需要在Java代码中加载XML布局。
在“Project”窗口,选择“entry > src > main > java > com.example.myapplication > slice” ,打开“MainAbilitySlice.java”文件,使用setUIContent方法加载“ability_main.xml”布局。此外,运行代码前需采用import(可使用Alt+Enter快捷键)引入对应类,否则会产生报错提示。
说明

HarmonyOS提供了Ability和AbilitySlice两个基础类,一个有界面的Ability可以由一个或多个AbilitySlice构成,AbilitySlice主要用于承载单个页面的具体逻辑实现和界面UI,是应用显示、运行和跳转的最小单元。

本文档以同一个Ability内的两个AbilitySlice之间的跳转为例,如果开发者希望实现两个Ability之间的跳转,请参考不同Page间导航。
“MainAbilitySlice.java”的示例代码如下:

    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_ability_main); // 加载XML布局
        }
    }

使用预览器或模拟器运行项目,效果如下图所示:

在这里插入图片描述

创建另一个页面

在上一节中,我们用XML的方式编写了一个包含文本和按钮的页面。为了帮助开发者熟悉在代码中创建布局的方式,接下来我们使用代码的方式编写第二个页面。

在“Project”窗口,打开“entry > src > main > java > com.example.myapplication”,右键点击“slice”文件夹,选择“New > Java Class”,命名为“SecondAbilitySlice”,单击回车键。
第二个页面上有一个文本。打开“SecondAbilitySlice”文件,添加一个Text,示例代码如下:

    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.Text;
    import ohos.agp.components.element.ShapeElement;
    import ohos.agp.utils.Color;
    import ohos.agp.components.DependentLayout.LayoutConfig;

    public class SecondAbilitySlice extends AbilitySlice {
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);

            // 声明布局
            DependentLayout myLayout = new DependentLayout(this);

            // 设置布局宽高
            myLayout.setWidth(LayoutConfig.MATCH_PARENT);
            myLayout.setHeight(LayoutConfig.MATCH_PARENT);

            // 设置布局背景为白色
            ShapeElement background = new ShapeElement();
            background.setRgbColor(new RgbColor(255, 255, 255));
            myLayout.setBackground(background);
            
            // 创建一个文本
            Text text = new Text(this);
            text.setText("Hi there");
            text.setWidth(LayoutConfig.MATCH_PARENT);
            text.setTextSize(100);
            text.setTextColor(Color.BLACK);

            // 设置文本的布局
            DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(LayoutConfig.MATCH_CONTENT, LayoutConfig.MATCH_CONTENT);
            textConfig.addRule(LayoutConfig.CENTER_IN_PARENT);
            text.setLayoutConfig(textConfig);
            myLayout.addComponent(text);
            super.setUIContent(myLayout);
        }
    }

实现页面跳转

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

    package com.example.myapplication.slice;

    import com.example.myapplication.ResourceTable;

    import ohos.aafwk.ability.AbilitySlice;
    import ohos.aafwk.content.Intent;
    import ohos.agp.components.Button;

    public class MainAbilitySlice extends AbilitySlice {
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            super.setUIContent(ResourceTable.Layout_ability_main);
            Button button = (Button) findComponentById(ResourceTable.Id_button);

            // 点击按钮跳转至第二个页面
            button.setClickedListener(listener -> present(new SecondAbilitySlice(), new Intent()));
        }
    }

再次运行项目,效果如图所示:


在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容