HCIA-HarmonyOS-Application-Developer学习笔记
HCIA-HarmonyOS Application Developer学习笔记
目录
一、HarmonyOS 介绍
HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统,它是一个全场景分布式智慧操作系统,覆盖了1+8+N全场景终端设备,其中手机是整个分布式能力的核心。
与原生Android 系统对比,HarmonyOS 不仅可以支持手机,还可以支持电脑、智慧屏、穿戴设备、智能家居、车机系统等等,从而形成一个全场景统一的操作系统。
通过多种分布式技术,整合不同终端硬件能力,形成一个虚拟的“超级终端”,应用开发者可基于该“超级终端”开发应用,聚焦上层业务逻辑,其优点是无需关注硬件差异;设备开发者可以按需调用其他终端能力,带来基于“超级终端”的创新服务体验。
二、HarmonyOS 应用开发流程
HarmonyOS 系统架构
HarmonyOS 整体以下至上可分为
内核层
、
系统服务层
、
应用框架层
和
应用层
。
其中系统服务层是HarmonyOS 的核心能力集合,通过框架层对应用程序提供服务,例如分布式数据管理、分布式任务调度、分布式软总线等都属于系统服务层,而例如Ability 框架属于应用框架层。另外,属于应用框架层的还有UI框架、用户程序框架等。
HarmonyOS 子系统集
HarmonyOS 的子系统集可分为以下:
子系统集
系统基本能力子系统集
基础软件服务子系统集
增强软件服务子系统集
硬件服务子系统集
1、常见的
系统基本能力子系统集
:UI框架、Ability框架、用户程序框架、分布式任务调度、分布式数据管理、分布式软总线等。
2、常见的
基础软件服务子系统集
:多媒体子系统、电话子系统、事件通知子系统等。
3、常见的
增强软件服务子系统集
:智慧屏专有业务子系统、穿戴专有业务子系统、IOT专有业务子系统等。
4、常见的
硬件服务子系统集
:位置服务子系统、生物特征识别服务子系统、穿戴专有硬件服务子系统、IOT专有硬件服务子系统等。
DevEco Studio
DevEco Studio是基于 IntelliJ IDEA Community 开源版本打造,面向华为终端全场景多设备的一站式集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等 E2E 的 HarmonyOS 应用开发服务,它支持
Java
、
JavaScript
、
XML
、
HML(HarmonyOS Markup Language)
、
C/C++
、
CSS
语言的代码开发和调试。
打开DevEco Studio,创建一个应用工程,可以在生成的基本应用包结构中,看到以下目录和文件:
使用DevEco Studio 工具进行应用开发时,支持
预览器
、
模拟器
和
真机
三种调测方式。
HarmonyOS 应用包结构
一个HarmonyOS 应用包结构主要包含
APP
和
HAP
(HarmonyOS Ability Package),一个APP中可以包含多个HAP,是由
逻辑代码
、
资源文件
、
第三方库
及
应用配置文件
组成的模块包,可分为
Entry
和
Feature
两种模块类型。
其中,
Entry.hap
是应用程序的主要入口,而
Feature.hap
是应用程序的其他部分,通常情况下,一种APP中只能有一个Entry.hap,
pack.info
是描述该应用程序的相关内容,另外,在每个HAP的根目录下都存在一个
config.json
配置文件。
这里只介绍config.json 配置文件其中主要的三个部分:
HAP
app
deviceConfig
module
如下,可看到其中的代码:
- app包含应用的全局配置信息,应用的包名称、版本号等等;deviceConfig包含应用在具体设备上的配置信息;module包含每个HAP包的配置信息,有每个Ability定义的基本属性,其中包含包名称、类名称以及该Ability提供的能力等等。
使用资源文件的方法
base 目录与限定词目录中的资源文件可以通过指定资源类型和资源名称来引用。
1、java 文件中引用 资源文件的格式:ResourceTable.type_name;
2、XML文件中引用资源文件的格式:$type:name;
3、rawfile 目录中的资源文件通过指定文件路径和文件名称来引用。
权限管理
应用权限需要在config.json 中使用“reqPermissions” 属性对需要的权限逐个进行声明,若没有在该文件中声明相关的权限,则应用将无法获得该权限的授权,另外,在应用中使用到的第三方库也涉及到权限使用,也需在config.json 中进行声明。
分布式能力
1、
分布式软总线
:是分布式能力的基础,为不同设备互联互通提供统一的分布式通信能力。
2、
分布式文件服务
:为用户不同设备中的应用程序提供文件共享的能力;
3、
分布式数据服务
:实现应用程序数据和用户数据的分布式管理。
4、
分布式任务调度
:支持对跨设备的应用进行远程启动、远程调用、远程连接以及迁移等操作;
5、
分布式设备虚拟化
:为用户不同设备之间进行资源融合、设备管理、数据处理,从而形成一个虚拟超级终端;
三、Ability 设计与开发
Ability 的概念和分类
Ability 是应用程序的主要组成部分,它可以分为
Feature Ability(FA)
和
Particle Ability(PA
),FA支持
Page 模板
,用于提供与用户交互的能力;PA支持
Service 模板
和
Data 模板
,Service模板用于提供后台运行任务的能力,Data模板用于对外部提供统一的数据访问接口。
Ability
Feature Ability
Page Ability
Particle Ability
Service Ability
Data Ability
一个Page Ability 可以由一个或多个AbilitySlice 组成,
AbilitySlice
是指应用的单个页面以及控制逻辑的总和,另外不同的Page Ability 之间可以跳转,并且可以指定跳转到目标Page Ability 中某个具体的AbilitySlice。
Page Ability
AbilitySlice
AbilitySlice
……
页面生命周期
当用户进入、浏览、退出页面时,页面会有不同的状态,并回调不同的生命周期状态方法给外界,Page Ability 和AbilitySlice 具有类似的生命周期回调方法:
1、
onStart()方法
:当系统首次创建Page实例时,触发该回调;对于一个Page实例,该回调在其生命周期过程中只触发一次,然后该逻辑进入INACTIVE状态。
2、
onActive()方法
:Page会在进入INACTIVE状态后来到前台。然后系统调用该回调,逻辑会进入ACTIVE状态,该状态是应用与用户交互的状态,此时Page将保持在该状态,除非某类事件发生导致Page失去焦点,比如用户点击返回键或导航到其他Page。
3、
onInActive()方法
:Page失去焦点后,系统将调用该回调,然后Page进入INACTIVE状态。
4、
onBackground()方法
:Page将不再对用户可见,该回调通知开发者进行相应的资源释放,然后Page进入BACKGROUND状态。
5、
onStop()方法
:系统要销毁Page时,该回调通知开发者进行系统资源的释放。
6、
onForeground()方法
:处于该状态的Page仍然驻留在内存中,当重新回到前台时,系统将调用该回调。
Intent载体
Intent 是对象之间传递信息的载体,它由
Operation
与
Parameters
元素构成。其中,
Action
表示动作,可自定义Action;Entity 表示类别,也可以自定义;
Uri
表示Uri 的相关描述,用于匹配Uri 的信息;
Flags
表示处理Intent 的方式;
BundleName
表示包描述;
AbilityName
表示待启动的Ability名称;
Deviceld
表示运行指定Ability的设备ID。
通过Intent 启动应用的过程是:构造包含BundleName 与AbilityName 的Operation对象,从而启动一个Ability ,并导航到该Ability。
页面间导航
1、在同一Page内导航,使用
present()
或
presentForResult()
方法实现同一Page内两个AbilitySlice 间的跳转。
2、在不同Page间导航,通过配置Intent 的Action,并使用
startAbility()
或
startAbilityForResult()
方法导航到目标Ability。获得返回结果的回调为onAbilityResult() ,在Ability 中调用setResult() 可以设置返回结果。
Particle Ability 开发
1、 Service Ability :主要用于后台运行任务,它在主线程中执行,可由其他应用或Ability启动。在一个设备上,同一个Service只存在一个实例,即Service Ability是单实例的。
- 启动Service 。通过将Intent传递给startAbility()方法来启动Service,不仅支持启动本地Service,还支持启动远程Service。另外通过构造包含Deviceld(设备ID)、BundleName(包名称)、AbilityName(待启动的Ability名称)的Operation对象来设置目标Service信息。
- 连接Service 。如果Service需要与Page Ability或其他应用的Service Ability进行交互,则应创建用于连接的Connection,另外,Service还支持其他Ability通过connectAbility()方法进行连接。在使用connectAbility()处理回调时,需要传入目标Service的Intent与IAbilityConnection的实例,其中IAbilityConnection提供了两个方法供开发者实现,onAbilityConnectDone()用来处理连接的回调,onAbilityDisconnectDone()用来处理断开连接的回调。
- 停止Service 。Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。要手动停止Service,有以下方法:在Service中通过terminateAbility()停止本Service;在其他Ability调用stopAbility()来停止Service。
2、 Data Ability :使用Data模板的Ability,对外提供一些增删改查以及文件操作等接口,其具体实现由开发者提供。Data的提供方和使用方都通过URl来标识一个具体的数据,它分为两种场景,跨设备场景需要额外制定DeviceID,而本地场景不需要。
四、UI 页面设计与开发
Java UI 框架
1、组件布局
Java UI框架中提供了一些标准布局功能的容器,继承自ComponentContainer,一般以"Layout”结尾,
StackLayout 布局方式
是堆叠(层叠)布局,视图以层叠的方式显示,默认情况下放到这块区域的左上角,第一个添加到布局中的视图显示在最底层,最后一个被放在最顶层;
DependentLayout 布局方式
可以指定相对于其他同级元素或相对于父组件的位置;
DirectionalLayout 布局方式
它用于将一组组件按照水平方向(horizontal)或者垂直方向(vertical)排布,子组件可以通过权重来按比例占用父组件的大小;
TableLayout 布局方式
以使用表格的方式划分子组件,如下图:
2、组件的分类
Java Ul框架的组件中,可以根据组件的功能从而分为布局类、交互类和显示类三种,
布局类
提供了不同布局规则的组件,
交互类
提供了在具体场景下与用户交互响应的功能,
显示类
提供了内容显示。
常用的组件有很多,例如,Text 是显示字符串的组件,定义后显示一块文本区域;TextField 是一种文本输入框组件;Button 是按钮组件,可以由文本、图标组成;Image 是显示图片的组件;ScrollView 是带滚动功能的组件,可以通过滚动显示更多内容。
JavaScript UI 框架
JavaScript UI 中基本组件主要有以下四类:
组件类型 | 主要组件 |
---|---|
基础组件 | text、image、progress、rating、span、marquee、image-animator、divider、search、menu、chart |
容器组件 | div、list、list-item、stack、swiper、tabs、tab-bar、tab-content、list-item- group、refresh、dialog、grid-container |
媒体组件 | video |
画布组件 | canvas |
五、任务派发方法
HarmonyOS 为开发者提供了同步派发任务、异步派发任务、异步延迟派发任务和成组派发任务四种任务派发方法。
TaskDispatcher 框架提供了以下几种主要的任务派发方法:
①
delayDispatch()
为
异步延迟派发任务
,异步执行,函数立即返回,内部会在延时指定时间后将任务派发到响应队列中;
②
syncDispatch()
为
同步派发任务
,派发任务并在当前线程等待任务执行完成,如果使用不当则会导致死锁;
③
asyncGroupDispatch()
为
异步成组派发任务
,且该组任务之间有一定的联系;
④
asyncDispatch()
为
异步派发任务
,派发任务,并立即返回,返回值是一个可用于取消任务的接口。
六、任务分发器
HarmonyOS为开发者提供了以下四种任务分发器:
TaskDispatcher具有多种实现,每种实现对应不同的任务分发器,可分为
全局并发任务分发器(GlobalTaskDispatcher)
、
并发任务分发器(ParallelTaskDispatcher)
、
串行任务分发器(SerialTaskDispatcher)
和
专有任务分发器(SpecTaskDispatcher)
。