HarmonyOS

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”。setting

  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

模拟器暂不支持的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两种类型,编译后会生成共享包。
    HAR与HSP两种共享包的主要区别
    三种包的区别

UIAbility组件

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

生命周期

UIAbility 生命周期

  1. Create状态:
    (1)UIAbility实例创建完成时触发。
    (2)以在该回调中进行页面初始化操作。
  2. WindowStageCreate和WindowStageDestroy状态
  • 在进入Foreground之前,系统会创建一个WindowStage。创建完成后进入 onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅
    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才能被其他模块引用
    module

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

export { CourseLearning } from './src/main/ets/pages/CourseLearning'
  1. 导入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",//导入的模块 
  }
}

  1. 引用:正常导入后就能使用了
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"
        }
      }
    ]
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值