这是无量测试之道的第210篇原创
今天我们来谈谈当下最火爆的万物互联的操作系统—Harmony OS,这是国人的骄傲,也是每一个中华儿女值得去学习和研究的国产操作系统。在这里主要是想通过自己所写的一个小 Demo 来初探一下 Harmony OS 系统下的 app 应用开发,如有不对之处还望指出,共勉之。
Step 1: 开发环境的搭建
IDE & SDK 的安装就不在这里详细讲解了,华为的官网上面既有安装包也有相关的步骤,相信大家可以通过文档自行完成。
Step2: app开发的相关术语学习(摘至华为官网)
第一部分:系统的定义
HarmonyOS 是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。
第二部分:开发app应用程序包结构
HarmonyOS 的用户应用程序包以APP Pack(Application Package)形式发布,它是由一个或多个 HAP(HarmonyOS Ability Package)以及描述每个 HAP 属性的pack.info组成。
HAP 是 Ability 的部署包,HarmonyOS 应用代码围绕 Ability 组件展开。 一个 HAP 是由代码、资源、第三方库及应用配置文件组成的模块包,可分为 entry 和feature 两种模块类型。
Entry
entry:应用的主模块。 一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。
Feature
feature:应用的动态特性模块。 一个 APP 可以包含一个或多个 feature 类型的 HAP,也可以不包含。只有包含 Ability 的 HAP 才能够独立运行。
Ability
Ability 是应用所具备的能力的抽象,一个应用可以包含一个或多个 Ability。 Ability 分为两种类型:FA(Feature Ability)和 PA(Particle Ability)。 FA/PA 是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
库文件
库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在 libs 目录。
资源文件
应用的资源文件(字符串、图片、音频等)存放于 resources 目录下,便于开发者使用和维护,详见资源文件的分类。
配置文件
配置文件 (config.json) 是应用的 Ability 信息,用于声明应用的 Ability,以及应用所需权限等信息,详见应用配置文件。
pack.info
描述应用软件包中每个 HAP 的属性,由 IDE 编译生成,应用市场根据该文件进行拆包和 HAP 的分类存储。
HAP 的具体属性包括: delivery-with-install: 表示该 HAP 是否支持随应用安装。“true”:表示支持随应用安装;“false”:表示不支持随应用安装。
name:HAP 文件名。
module-type:模块类型,entry 或 feature。
device-type:表示支持该 HAP 运行的设备类型。
HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和 config.json 文件。HAR 不同于 HAP,HAR 不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。
在 HarmonyOS 上运行的应用,有两种形态: 传统方式的需要安装的应用。 提供特定功能,免安装的应用(即原子化服务)。
第三部分:开发过程中常见的术语解释
Page 与 AbilitySlice
Page 模板(以下简称“Page”)是 FA 唯一支持的模板,用于提供与用户交互的能力。一个Page 可以由一个或多个 AbilitySlice 构成,AbilitySlice 是指应用的单个页面及其控制逻辑的总和。
当一个 Page 由多个 AbilitySlice 共同构成时,这些 AbilitySlice 页面提供的业务能力应具有高度相关性。例如,新闻浏览功能可以通过一个 Page 来实现,其中包含了两个AbilitySlice:一个 AbilitySlice 用于展示新闻列表,另一个 AbilitySlice 用于展示新闻详情。
Intent
Intent 是对象之间传递信息的载体。例如,当一个 Ability 需要启动另一个 Ability 时,或者一个 AbilitySlice 需要导航到另一个 AbilitySlice 时,可以通过 Intent 指定启动的目标同时携带相关数据。
Ability
Ability 是应用所具备能力的抽象,也是应用程序的重要组成部分。 一个应用可以具备多种能力(即可以包含多个 Ability ),HarmonyOS 支持应用以 Ability 为单位进行部署。Ability 可以分为 FA(Feature Ability)和 PA(Particle Ability)两种类型,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。
FA 支持 Page Ability: Page 模板是 FA 唯一支持的模板,用于提供与用户交互的能力。一个 Page 实例可以包含一组相关页面,每个页面用一个 AbilitySlice 实例表示。
PA 支持 Service Ability 和 Data Ability: Service 模板:用于提供后台运行任务的能力。 Data 模板:用于对外部提供统一的数据访问抽象。
Service Ability 基本概念
基于 Service 模板的 Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。
Service 可由其他应用或 Ability 启动,即使用户切换到其他应用,Service 仍将在后台继续运行。Service 是单实例的。在一个设备上,相同的 Service 只会存在一个实例。如果多个 Ability 共用这个实例,只有当与 Service 绑定的所有 Ability 都退出后,Service 才能够退出。
由于 Service 是在主线程里执行的,因此,如果在 Service 里面的操作时间过长,开发者必须在 Service 里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应。
Data Ability基本概念
使用 Data 模板的 Ability(以下简称“Data”)有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data 既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。
数据的存放形式多样,可以是数据库,也可以是磁盘上的文件。Data 对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供。
备注:以上是一些在进行 Harmony OS app 应用开发过程中会经常涉及到的一些概念的东西,也是非常重要的,有一定的理解后将有利于我们进行系统的开发,所以我整理了一下放到了第二部分。
Step3:Demo 示例讲解
第一部分:程序结构与程序入口
如上图所示:entry 是应用的主模块, 1——标识的地方是 Slice 切片, 2——标识的地方是 main 方法所在的类文件, 3——标识的地方是存放样式文件, 4——标识的地方是存放的布局文件。
第二部分:两个Slice 文件内容
代码语言:javascript复制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;
import ohos.agp.components.Component;
public class MainAbilitySlice extends AbilitySlice {
/*
onStart()
当系统首次创建Page实例时,触发该回调。对于一个Page实例,该回调在其生命周期过程中仅触发一次,
Page在该逻辑后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice。
*/
@Override
public void onStart(Intent intent) {
super.onStart(intent);
//ResourceTable相应当selenium中的driver,这里要是在设置布局为 ability_main.xml文件的内容,前面的Layout_是框架规则好的
super.setUIContent(ResourceTable.Layout_ability_main);
//类似于python 中selenium中的通过 id 来查找元素,这里的Id_button是ability_main.xml中的button 的id值
Button button = (Button) findComponentById(ResourceTable.Id_button);
//判断button 是否为null
if(button != null){
//给button 设置click监听事件
button.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
//这里相当于是render另一个页面(这里传入了一个SecondAbilitySlice and Intent),实现了页面的跳转
present(new SecondAbilitySlice(),new Intent());
}
});
}
}
/*
onActive()
Page会在进入INACTIVE状态后来到前台,然后系统调用此回调。Page在此之后进入ACTIVE状态,
该状态是应用与用户交互的状态。Page将保持在此状态,除非某类事件发生导致Page失去焦点,
比如用户点击返回键或导航到其他Page。当此类事件发生时,会触发Page回到INACTIVE状态,
系统将调用onInactive()回调。此后,Page可能重新回到ACTIVE状态,系统将再次调用onActive()回调。
因此,开发者通常需要成对实现onActive()和onInactive(),并在onActive()中获取在onInactive()中被释放的资源。
*/
@Override
public void onActive() {
super.onActive();
}
/*
onForeground()
处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此Page),
系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态。
开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,
系统将通过onActive()回调通知开发者用户。
*/
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
package com.example.myapplication.slice;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
//import ohos.global.systemres.ResourceTable;
import com.example.myapplication.ResourceTable;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class SecondAbilitySlice extends AbilitySlice {
private static final int MY_MODULE = 200;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_second_slice);
Text text = (Text) findComponentById(ResourceTable.Id_second_text);
if(text != null){
String myname = intent.getStringParam("name");
final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, MY_MODULE, "MY_TAG_Tony"); //MY_MODULE=0x00201
HiLog.info(label, "the myname is:", myname);
}
//这里跟MailAbilitySlice中的作用一样,找button元素,这个元素就是Go Back
Button button=(Button) findComponentById(ResourceTable.Id_seconde_button);
if(button != null){
button.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
present(new MainAbilitySlice(),new Intent());
}
});
}
}
}
第三部分:两个 Layout 布局和一个 graphic 文件内容
备注:
- 表示的是文本框,里面的 ohos:text 表示文本的内容
- 表示的是按钮,里面的 ohos:id 表示元素的id值
- 里面的 ohos:text 表示按钮的文本内容
- 里面的 ohos:background_element 表示背景(就是CSS)
- Graphic 文件夹下存放的是样式文件,在Button 和 Text 里面可以引用这个里面的样式,如上图中的第三张图所示。
- 在开发过程中,如 layout 目录下文件名和 id 值及 graphic 目录下的文件名在IDE中是有联想选择的,有的会拼接上一些固定字符串。
- Import 导入第三方包时,一定要注意导入是正确的,在开发过程中发现有同名包,但是不是我们想要使用的,就会一直报错。
第四部分:运行后得到的效果图如下所示(这里选择的设备为 Iphone)
实现的场景非常的简单,就是点击下面第一张图中的 Go 时(绑定了 click 监听事件),就跳转到如下第二张图中去,这里是切换到了另一个 Slice 的 page。当再点击此张图片中的 Go Back时,又能够回到第一张图的界面。
end