HarmonyOS APP开发
- HarmonyOS
-
- 鸿蒙系统开发需要具备的环境及技术
- DevEco
-
- 使用环境
- 格式化
- 快速查阅API接口及组件参考文档
- [Optimize Imports功能](#Optimize Imports功能)
- 启动模拟器提示未开启Hyper-V
- 模拟器暂不支持的Kit
- 功能快捷键
- 应用程序框架基础
- ArkUI
- 数据与变量
-
- [[深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别](https://blog.csdn.net/chencl1986/article/details/130541697)](#深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别)
- 通过用户首选项实现数据持久化
- 依赖加载
- 权限配置
HarmonyOS
鸿蒙系统开发需要具备的环境及技术
操作系统要求(#1.1)
- Windows 10 企业版
- Windows 10 专业版
- Windows 10 教育版
DevEco
使用环境
格式化
在使用代码格式化功能时,您可以使用快捷键Ctrl + Alt + L(macOS为Option+Shift+Command +L) 可以快速对选定范围的代码进行格式化。(重新格式化快捷键 :Ctrl + Shift + Alt + L)
如果在进行格式化时,对于部分代码片段不需要进行自动的格式化处理,可以通过如下方式进行设置:(默认设置)
-
在File > Settings >Editor > Code Style(macOS为DevEco Studio > Preferences > Editor > Code Style),单击"Formatter",勾选"Turn formatter on/off with markers in code comments"。
-
在不需要进行格式化操作的代码块前增加"//@formatter:off ",在不格式化代码块的最后增加"//@formatter:on",即表示对该范围的代码块不需要进行格式化操作。
快速查阅API接口及组件参考文档
在编辑器中调用ArkTS/JS API或组件时,支持在编辑器中快速、精准调取出对应的参考文档。
可在编辑器中,鼠标悬停在需要查阅的接口或组件,弹窗将显示当前接口/组件在不同API版本下的参数等信息,单击弹窗右下角Show in API Reference,可以快速查阅更详细的API文档。
Optimize Imports功能
使用编辑器提供的Optimize Imports,可以快速清除未使用的import ,并根据设置的规则对import进行合并或排序。
启动模拟器提示未开启Hyper-V
解决办法:在Windows电脑上启动模拟器,提示未开启Hyper-V(系统版本请看)
模拟器暂不支持的Kit
功能快捷键
快速覆写父类:Ctrl + O 或右键单击Generate...,选择Override Methods
快速生成构造器:Alt + Insert 鼠标右键选择Generate...,在弹窗中选择Constructor
快速生成get/set方法:Alt + Insert 鼠标右键选择Generate...,在弹窗中选择Getter and Setter
快速生成声明信息到Index文件:通过Generate...>Declarations功能
应用程序框架基础
Module类型
- Ability类型的Module:用于实现应用的功能和特性 。
每一个Ability类型的Module编译后,会生成一个以.hap为后缀的文件,我们称其为HAP(Harmony Ability Package)包。是应用安装的基本单位,一个应用中可以包含一个或多个HAP包。 - Library类型的Module :用于实现代码和资源的共享 。
同一个Library类型的Module可以被其他的Module多次引用,合理地使用该类型的Module,能够降低开发和维护成本。Library类型的Module分为Static和Shared两种类型,编译后会生成共享包。
UIAbility组件
一种包含UI的应用组件,主要用于和用户交互。
生命周期
- Create状态:
(1)UIAbility实例创建完成时触发。
(2)以在该回调中进行页面初始化操作。 - WindowStageCreate和WindowStageDestroy状态
-
在进入Foreground之前,系统会创建一个WindowStage。创建完成后进入 onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅
-
在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面,并根据需要调用on('windowStageEvent')方法订阅WindowStage的事件(获焦/失焦、可见/不可见)。
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = '[EntryAbility]';
const DOMAIN_NUMBER: number = 0xFF00;export default class EntryAbility extends UIAbility {
// ...
onWindowStageCreate(windowStage: window.WindowStage): void {
// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
try {
windowStage.on('windowStageEvent', (data) => {
let stageEventType: window.WindowStageEventType = data;
switch (stageEventType) {
case window.WindowStageEventType.SHOWN: // 切到前台
hilog.info(DOMAIN_NUMBER, TAG, 'windowStage foreground.');
break;
case window.WindowStageEventType.ACTIVE: // 获焦状态
hilog.info(DOMAIN_NUMBER, TAG, 'windowStage active.');
break;
case window.WindowStageEventType.INACTIVE: // 失焦状态
hilog.info(DOMAIN_NUMBER, TAG, 'windowStage inactive.');
break;
case window.WindowStageEventType.HIDDEN: // 切到后台
hilog.info(DOMAIN_NUMBER, TAG, 'windowStage background.');
break;
default:
break;
}
});
} catch (exception) {
hilog.error(DOMAIN_NUMBER, TAG, 'Failed to enable the listener for window stage event changes. Cause:' + JSON.stringify(exception));
}
hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
// 设置UI加载
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
} -
WindowStageWillDestroy状态:对应onWindowStageWillDestroy()回调,在WindowStage销毁前执行,此时WindowStage可以使用。(释放UI资源)
- Foreground和Background状态
Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。 - Destroy状态
UIAbility组件启动模式
- singleton(单实例模式):只存在一个该类型的UIAbility实例
- multiton(多实例模式):每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。
- specified(指定实例模式):指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。(存在实例匹配)
ArkUI
ArkWeb
UI范式基本语法
@Styles装饰器:定义组件重用样式
提炼公共样式进行复用的装饰器。
说明:
-
@Styles方法不支持参数。
-
@Styles可以定义在组件内或全局,在全局定义时需在方法名前面添加function关键字,组件内定义时则不需要添加function关键字。
// 全局
@Styles function functionName() { ... }// 在组件内
@Component
struct FancyUse {
@Styles fancy() {
.height(100)
}
} -
定义在组件内的@Styles可以通过this访问组件的常量和状态变量,并可以在@Styles里通过事件来改变状态变量的值。
-
组件内@Styles的优先级高于全局@Styles。
@Extend装饰器:定义扩展组件样式
扩展原生组件样式。
使用规则:
-
和@Styles不同,@Extend仅支持在全局定义,不支持在组件内部定义。(只能在当前文件内使用,不支持export)
-
和@Styles不同,@Extend支持封装指定组件的私有属性、私有事件和自身定义的全局方法。
// @Extend(Text)可以支持Text的私有属性fontColor
@Extend(Text) function fancy () {
.fontColor(Color.Red)
}
// superFancyText可以调用预定义的fancy
@Extend(Text) function superFancyText(size:number) {
.fontSize(size)
.fancy()
} -
和@Styles不同,@Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。
// xxx.ets
@Extend(Text) function fancy (fontSize: number) {
.fontColor(Color.Red)
.fontSize(fontSize)
}@Entry
@Component
struct FancyUse {
build() {
Row({ space: 10 }) {
Text('Fancy')
.fancy(16)
Text('Fancy')
.fancy(24)
}
}
} -
@Extend装饰的方法的参数可以为function,作为Event事件的句柄。
@Extend(Text) function makeMeClick(onClick: () => void) {
.backgroundColor(Color.Blue)
.onClick(onClick)
}@Entry
@Component
struct FancyUse {
@State label: string = 'Hello World';onClickHandler() { this.label = 'Hello ArkUI'; } build() { Row({ space: 10 }) { Text(`${this.label}`) .makeMeClick(() => {this.onClickHandler()}) } }
}
-
@Extend的参数可以为状态变量,当状态变量改变时,UI可以正常的被刷新渲染。
数据与变量
深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别
通过用户首选项实现数据持久化
1、运作机制
用户程序通过ArkTS接口调用用户首选项读写对应的数据文件。开发者可以将用户首选项持久化文件的内容加载到Preferences实例,每个文件唯一对应到一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。
2、约束限制
- Key键为string类型,要求非空且长度不超过1024个字节。
- 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16 * 1024 * 1024个字节。
- 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。
3、接口说明
- 获取Preferences实例:
getPreferencesSync(context: Context, options: Options): Preferences
- 写入Preferences实例:
putSync(key: string, value: ValueType): void
- 检查Preferences实例是否包含名为给定Key的存储键值对:
hasSync(key: string): boolean
- 获取键对应的值:
getSync(key: string, defValue: ValueType): ValueType
(如果值为null或者非默认值类型,返回默认数据defValue) - 删除名为给定Key的存储键值对:
deleteSync(key: string): void
- 将当前Preferences实例的数据异步存储到用户首选项持久化文件中:
flush(callback: AsyncCallback<void>): void
- 订阅数据变更callback回调:
on(type: 'change', callback: Callback<string>): void
- 取消订阅数据变更:
off(type: 'change', callback?: Callback<string>): void
- 移除指定的Preferences实例:
deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void
依赖加载
module的引用步骤
-
新建module:选择shared library ,static library ,visual library 三种template才能被其他模块引用
-
module 中的类对外暴露export:在Index.ets(模块根目录的Index.ets,不是pages下面的)中导出需要引用的对象
export { CourseLearning } from './src/main/ets/pages/CourseLearning'
-
导入module:要使用的nodule中的oh-package.json5文件中配置声明路径
{
"name": "entry",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"@ohos/learning": "file:../features/learning",//导入的模块
}
} -
引用:正常导入后就能使用了
import { CourseLearning } from '@ohos/learning'
权限配置
权限列表
对所有应用开放
受限开放权限
仅对MDM应用开放
授权方式
system_grant(系统授权)
- 应用被允许访问的数据不会涉及到用户或设备的敏感信息
- 系统会在用户安装应用时,自动把相应权限授予给应用。
- system_grant(系统授权)权限列表
user_grant(用户授权)
- 被允许访问的数据将会涉及到用户或设备的敏感信息
- 不仅需要在安装包中申请权限 ,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
申请应用权限
- 声明权限:应用需要在module.json5配置文件的requestPermissions标签中声明权限
- name:必须,填写需要使用的权限名称。取值范围
- reason:可选,用于描述申请权限的原因,当申请的权限为user_grant权限 时此字段必填。可参考权限使用理由的文案内容规范。
- usedScene:可选,用于描述权限使用的场景,当申请的权限为user_grant权限时建议填写此字段。由abilities和when组成。
-
其中abilities可以配置为多个UIAbility组件(UIAbility或者ExtensionAbility组件的名称。)。
-
when表示调用时机(inuse(使用时)、always(始终)。)。
{
"module" : {
// ...
"requestPermissions":[
{
"name" : "ohos.permission.PERMISSION1",
"reason": "string:reason", "usedScene": { "abilities": [ "FormAbility" ], "when":"inuse" } }, { "name" : "ohos.permission.PERMISSION2", "reason": "string:reason",
"usedScene": {
"abilities": [
"FormAbility"
],
"when":"always"
}
}
]
}
}
-