HarmonyOS

HarmonyOS APP开发

HarmonyOS

鸿蒙系统开发需要具备的环境及技术

操作系统要求(#1.1)

运行模拟器需要开启 Hyper-V 支持

  • Windows 10 企业版
  • Windows 10 专业版
  • Windows 10 教育版

DevEco

使用环境

格式化

在使用代码格式化功能时,您可以使用快捷键Ctrl + Alt + L(macOS为Option+Shift+Command +L) 可以快速对选定范围的代码进行格式化。(重新格式化快捷键 :Ctrl + Shift + Alt + L)

如果在进行格式化时,对于部分代码片段不需要进行自动的格式化处理,可以通过如下方式进行设置:(默认设置)

  1. 在File > Settings >Editor > Code Style(macOS为DevEco Studio > Preferences > Editor > Code Style),单击"Formatter",勾选"Turn formatter on/off with markers in code comments"。

  2. 在不需要进行格式化操作的代码块前增加"//@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


HDC常见命令及环境准备

功能快捷键

快速覆写父类:Ctrl + O 或右键单击Generate...,选择Override Methods

快速生成构造器:Alt + Insert 鼠标右键选择Generate...,在弹窗中选择Constructor

快速生成get/set方法:Alt + Insert 鼠标右键选择Generate...,在弹窗中选择Getter and Setter

快速生成声明信息到Index文件:通过Generate...>Declarations功能

应用程序框架基础

Module类型

  1. Ability类型的Module:用于实现应用的功能和特性
    每一个Ability类型的Module编译后,会生成一个以.hap为后缀的文件,我们称其为HAP(Harmony Ability Package)包。是应用安装的基本单位,一个应用中可以包含一个或多个HAP包。
  2. Library类型的Module :用于实现代码和资源的共享
    同一个Library类型的Module可以被其他的Module多次引用,合理地使用该类型的Module,能够降低开发和维护成本。Library类型的Module分为Static和Shared两种类型,编译后会生成共享包。

UIAbility组件

一种包含UI的应用组件,主要用于和用户交互。

生命周期
  1. Create状态:
    (1)UIAbility实例创建完成时触发。
    (2)以在该回调中进行页面初始化操作。
  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资源)

  1. Foreground和Background状态
    Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。
  2. 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的引用步骤

  1. 新建module:选择shared librarystatic libraryvisual library 三种template才能被其他模块引用

  2. module 中的类对外暴露export:在Index.ets(模块根目录的Index.ets,不是pages下面的)中导出需要引用的对象

    export { CourseLearning } from './src/main/ets/pages/CourseLearning'

  3. 导入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",//导入的模块
    }
    }

  4. 引用:正常导入后就能使用了

    import { CourseLearning } from '@ohos/learning'

权限配置

权限列表

对所有应用开放
受限开放权限
仅对MDM应用开放

授权方式

system_grant(系统授权)
user_grant(用户授权)
  • 被允许访问的数据将会涉及到用户或设备的敏感信息
  • 不仅需要在安装包中申请权限 ,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

申请应用权限

  1. 声明权限:应用需要在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"
      }
      }
      ]
      }
      }

相关推荐
长弓三石1 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
SameX3 小时前
鸿蒙 Next 电商应用安全支付与密码保护实践
前端·harmonyos
SuperHeroWu74 小时前
【HarmonyOS】键盘遮挡输入框UI布局处理
华为·harmonyos·压缩·keyboard·键盘遮挡·抬起
sanzk8 小时前
华为鸿蒙应用开发
华为·harmonyos
SoraLuna13 小时前
「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
macos·ui·harmonyos
ClkLog-开源埋点用户分析14 小时前
ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力
华为·开源·开源软件·harmonyos
mg66814 小时前
鸿蒙系统的优势 开发 环境搭建 开发小示例
华为·harmonyos
模拟IC攻城狮14 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
lqj_本人14 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
lqj_本人14 小时前
使用 Flutter 绘制一个棋盘
harmonyos