我的第一个基于HarmonyOS的 (鸿蒙 OS)TV

575 阅读8分钟

距离鸿蒙 OS 2.0 发布已经过去一些日子了,由于公司项目的事情比较多,一直没有怎么去关注,这位国产的HarmonyOS,闲暇之余,我看了下这个HarmonyOS,感觉还不错,支持java和JavaScript开发,对于做作为前端开发人员,也顺便了解下!

harmonyos.png

HarmonyOS 是什么?

在官网上是这样说的: HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。

  • 对消费者而言,HarmonyOS能够将生活场景中的各类终端进行能力整合,形成一个“超级虚拟终端”,可以实现不同的终端设备之间的快速连接、能力互助、资源共享,匹配合适的设备、提供流畅的全场景体验。
  • 对应用开发者而言,HarmonyOS采用了多种分布式技术,使得应用程序的开发实现与不同终端设备的形态差异无关,降低了开发难度和成本。这能够让开发者聚焦上层业务逻辑,更加便捷、高效地开发应用。
  • 对设备开发者而言,HarmonyOS采用了组件化的设计方案,可以根据设备的资源能力和业务特征进行灵活裁剪,满足不同形态的终端设备对于操作系统的要求。

HarmonyOS 特点

  1. 分布式软总线

分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。

  1. 分布式设备虚拟化

分布式设备虚拟化平台可以实现不同设备的资源融合、设备管理、数据处理,多种设备共同形成一个超级虚拟终端。针对不同类型的任务,为用户匹配并选择能力合适的执行硬件,让业务连续地在不同设备间流转,充分发挥不同设备的资源优势。

  1. 分布式数据管理

分布式数据管理基于分布式软总线的能力,实现应用程序数据和用户数据的分布式管理。用户数据不再与单一物理设备绑定,业务逻辑与数据存储分离,应用跨设备运行时数据无缝衔接,为打造一致、流畅的用户体验创造了基础条件。

  1. 分布式任务调度

分布式任务调度基于分布式软总线、分布式数据管理、分布式Profile等技术特性,构建统一的分布式服务管理(发现、同步、注册、调用)机制,支持对跨设备的应用进行远程启动、远程调用、远程连接以及迁移等操作,能够根据不同设备的能力、位置、业务运行状态、资源使用情况,以及用户的习惯和意图,选择合适的设备运行分布式任务。

  1. 一次开发,多端部署

HarmonyOS提供了用户程序框架、Ability框架以及UI框架,支持应用开发过程中多终端的业务逻辑和界面逻辑进行复用,能够实现应用的一次开发、多端部署,提升了跨设备应用的开发效率。一次开发、多端部署。

  1. 统一OS,弹性部署

HarmonyOS通过组件化和小型化等设计方法,支持多种终端设备按需弹性部署,能够适配不同类别的硬件资源和功能需求。支撑通过编译链关系去自动生成组件化的依赖关系,形成组件树依赖图,支撑产品系统的便捷开发,降低硬件设备的开发门槛。

  • 支持各组件的选择(组件可有可无):根据硬件的形态和需求,可以选择所需的组件。
  • 支持组件内功能集的配置(组件可大可小):根据硬件的资源情况和功能需求,可以选择配置组件中的功能集。例如,选择配置图形框架组件中的部分控件。
  • 支持组件间依赖的关联(平台可大可小):根据编译链关系,可以自动生成组件化的依赖关系。例如,选择图形框架组件,将会自动选择依赖的图形引擎组件等。

但我看完这些的时候,感觉前端估计要占用安卓的市场啦!估计一部分安卓开发人员是不是要面临着危机;看到“一次开发,多端部署”这个时候感觉用html 开发一个页面,通过各种外壳包起来形成多端的应用,就像DCloud一样。其实我在想,到时候java 开发一个应用,这个功能和JavaScript 开发应用一样,在市场上会不会面临2个,到时候会不会出现各种五花八门的应用,增加市场的管理能力呢?哈哈,这不是我们考虑的问题啦!!来看看怎么来用JavaScript写第一个HarmonyOS 的应用。

环境搭建

  1. 华为账号注册

  2. 操作系统 支持 Windows10 64,至于Windows7是否支持,有win7的同学可以试下, mac系统支持,linux 不支持

  3. 开发工具 DevEco Studio 2.0 Beta1

  4. nodejs 安装 [JavaScript 开发用到的],我的是v12.8.3

因为我的电脑本来就有java的环境,jdk1.8和gradle6.7,可以不装,DevEco Studio 2.0 Beta1里有,我装这些因为我已配好变量,大部分jar包和缓存都变更目录,防止系统盘吃紧的出现。

IDE DevEco Studio 2.0 Beta1 安装

跟普通软件一样,一步一步的走就行啦

首次启动配置,可以不配置,我这边为了更好的方便管理,所以我这边做了配置,这个ide 感觉跟idea 差不多。

在这里插入图片描述

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

创建项目

  1. 选择设备:一共有 TV,Wearable,lite Wearable三种选择;我这边选择的第一个TV,模板选的第四个 list Feature Ability(js)
  • TV设备下一共有支持6种模板 java 开发 三种, js 开发三种,每个有啥不一样,通过每个模板上面的界面就以看出;
  • Wearable设备下一共有支持3种模板 java 开发 一种, js 开发二种,每个有啥不一样,通过每个模板上面的界面就以看出;
  • lite Wearable设备下一共有支持2种模板,每个有啥不一样,通过每个模板上面的界面就以看出; 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
  1. 选择配置
  • Project Name: MyTv 项目名称
  • Package name: com.example.myTv 包名
  • Save location: F:/MyTv 存放路径
  • Compatible SDK: SDK:API Version 3 SDK 版本 在这里插入图片描述
  1. 自动下载和构建项目工程 在这里插入图片描述

在这里插入图片描述

项目工程结构

MyTV
├─ .gitignore                                       git 排除的文件
├─ .idea                                            当前IDE生成的配置文件
│  ├─ codeStyles
│  │  └─ codeStyleConfig.xml
│  ├─ gradle.xml
│  └─ misc.xml
├─ entry                                            项目入口
│  ├─ .gitignore                                    git 排除的文件
│  ├─ libs
│  ├─ node_modules                                  node 依赖
│  ├─ package.json                                  node 依赖包管理
│  └─ src                                           源代码
│     ├─ main
│     │  ├─ config.json                             鸿蒙项目配置
│     │  ├─ java                                    Java代码工程
│     │  │  └─ com
│     │  │     └─ example
│     │  │        └─ mytv
│     │  │           ├─ MainAbility.java            Java启动入口
│     │  │           └─ MyTV.java                   Java初始化
│     │  ├─ js                                      JS代码工程
│     │  │  └─ default                              默认配置文件
│     │  │     ├─ app.js                            JS 项目入口
│     │  │     ├─ common                            公共组件和文件
│     │  │     │  ├─ arrow.png
│     │  │     │  └─ logo.png
│     │  │     ├─ i18n                              国际化
│     │  │     │  ├─ en-US.json
│     │  │     │  └─ zh-CN.json
│     │  │     └─ pages                             页面存放文件夹
│     │  │        └─ index                          首页文件夹
│     │  │           ├─ index.css                   首页 css 样式
│     │  │           ├─ index.hml                   首页 hml 结构
│     │  │           └─ index.js                    首页 js 数据绑定代码
│     │  └─ resources                               静态资源文件,图片、视频等
│     │     ├─ base
│     │     │  ├─ element
│     │     │  │  └─ string.json
│     │     │  └─ media
│     │     │     └─ icon.png
│     │     └─ rawfile
│     └─ test                                       单元测试文件夹
│        └─ java
│           └─ com
│              └─ example
│                 └─ mytv
│                    └─ MainAbilityTest.java
├─ gradle                                           Java 和gradle 依赖管理工具配置
│  └─ wrapper
│     ├─ gradle-wrapper.jar
│     └─ gradle-wrapper.properties
├─ gradle.properties
├─ gradlew
└─ gradlew.bat

接下来我们详细看下首页的3个文件

src/js/default/pages/index/index.css, 其实更我们常规的写法没有什么区别!

...
.title {
    line-height: 60px;
    font-size: 48px;
    margin-bottom: 16px;
    color: #ffffff;
    margin-left: 48px;
}

.content_box {
    flex-direction: column;
    justify-content: flex-start;
    align-items: flex-start;
    width: 516px;
    margin-top: 24px;
}

.content-list {
    width: 516px;
    flex-direction: column;
    justify-content: flex-start;
    align-items: flex-start;
    flex-grow: 1;
}

.content-bar {
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    width: 420px;
    height: 48px;
    margin-left: 48px;
    margin-right: 48px;
    background-color: #808080;
    border-radius: 8px;
}
...

src/js/default/pages/index/index.html, 写过vue 的应该知道 其实这个就是 一个模板,就是template中间的部分。

<div class="container">
    <div class="content_box">
        <text class="title">{{Title}}
        </text>
        <list class="content-list">
            <list-item type="listItem" class="{{list_item_class1}}" onfocus="focusFunc1" onblur="blurFunc1">
                <text class="{{text_class1}}">{{$t('strings.list')}} 1
                </text>
                <div class="bar-more">
                    <image class="bar-img" src="../../common/arrow.png"></image>
                </div>
            </list-item>
            <list-item type="divider" style="height: 12px"></list-item>
            <list-item type="listItem" class="{{list_item_class2}}" onfocus="focusFunc2" onblur="blurFunc2">
                <text class="{{text_class2}}">{{$t('strings.list')}} 2
                </text>
                <div class="bar-more">
                    <image class="bar-img" src="../../common/arrow.png"></image>
                </div>
            </list-item>
...
        </div>
        <div class="text_box">
            <text class="img-text">{{$t('strings.img-text')}}
            </text>
        </div>
    </div>
</div>

src/js/default/pages/index/index.js, 写过vue 的应该知道 其实这个vue js 差不多 就是把生命之后去掉 保留data和menths里的东西。

export default {
    data: {
        Title: "",
        list_item_class1: "content-bar",
        text_class1: "bar-title",
        list_item_class2: "content-bar",
        text_class2: "bar-title",
        list_item_class3: "content-bar",
        text_class3: "bar-title",
        list_item_class4: "content-bar",
        text_class4: "bar-title",
        list_item_class5: "content-bar",
        text_class5: "bar-title",
        list_item_class6: "content-bar",
        text_class6: "bar-title",
    },
    onInit() {
        this.Title = this.$t('strings.title');
    },
    ....
    blurFunc6: function () {
        this.list_item_class6 = "content-bar";
        this.text_class6 = "bar-title";
    }
}

启动我的第一个TV

在启动项目之前,我们先介绍写模拟器,其实做安卓开发的都知道有个模拟器,就相当与我们写好代码,之后在浏览器种可以看效果,这个模拟器相当于一个浏览器就行啦!因为项目需要运行在模拟器中,所以得在 DevEco Studio 中创建一个 TV 模拟器,这里需要注意的是,HarmonyOS的模拟器是远程桌面的方式进行访问,所以需要先认证华为开发者账号。要创建模拟器,在 Tools 菜单中选择 HVD Manager:

在这里插入图片描述 图-12 图-13 在这里插入图片描述

点击右上方的按钮,运行,把首页的内容展示在模拟器中

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

编写首页

src/js/default/pages/index/index.js

我们在onInit 直接设置名字,这里写法你会看到 this.$t('strings.title') 的写法,这个是国际化的,就是我们通常说的 中文和英文界面的那种,在这里为了学习,这个多语言就不写啦,直接赋值汉字看下效果

this.$t('strings.title') 改为 this.Title = "我的第一个TV应用";

图-18

给每个Item 加入交互事件

...

            <list-item type="listItem" class="{{list_item_class1}}" onclick="likeClick(1)" onfocus="focusFunc1" onblur="blurFunc1">
                <text class="{{text_class1}}">{{$t('strings.list')}} 1
                </text>
                <div class="bar-more">
                    <image class="bar-img" src="../../common/arrow.png"></image>
                </div>
            </list-item>
            ...

js

....

    likeClick: function(type) {
        switch (type) {
            case 1:
                this.likeImage = "/common/timg.jpg";
                this.imgText = "第一个item";
            break;
            case 2:
                this.likeImage = "/common/logo.png";
                this.imgText = "第二个item";
            break;
            case 3:
                this.likeImage = "/common/arrow.png";
                this.imgText = "第三个item";
            default:
            break;
        }
    }

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

在这里插入图片描述

更多api more

总结

感觉ide 跑起来有点吃力,运行起来有点像卡顿,ide 需要支持热更新和优化,其他的感觉跟开发安卓和小程序 没啥差别!个人理解,HarmonyOS做成这样不错啦,顶!

我正在参加 CSDN 的【鸿蒙技术征文】活动,请给我点赞支持。