跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
TypeScript大前端

HarmonyOS 开发核心知识点总结(一)

HarmonyOS 开发涵盖 LazyForEach 数据懒加载机制、Preferences 用户首选项管理、@Builder 自定义构建函数、User-Agent 设置、Profile Manager 设备配置、UIAbility 启动模式、HTTP 网络请求、RichEditor 富文本编辑、安全控件属性、背景亮度设置、多设备交互焦点导航、应用上下文加密分区(EL1-EL5)及 Image 图片适配等核心技术点。重点涉及 ArkTS 语法规范、网络请求生命周期管理、数据加密存储策略及跨设备交互体验优化。

不知所云发布于 2026/3/16更新于 2026/4/2611 浏览
HarmonyOS 开发核心知识点总结(一)

一、LazyForEach: 数据懒加载

LazyForEach 必须在容器组件内使用,仅有 List、Grid、Swiper 以及 WaterFlow 组件支持数据懒加载(可配置 cachedCount 属性,即只加载可视部分以及其前后少量数据用于缓冲),其他组件仍然是一次性加载所有的数据。支持数据懒加载的父组件根据自身及子组件的高度或宽度计算可视区域内需布局的子节点数量,高度或宽度的缺失会导致部分场景懒加载失效。

List 设置 cachedCount 后,显示区域外上下各会预加载并布局 cachedCount 行 ListItem。计算 ListItem 行数时,会计算 ListItemGroup 内部的 ListItem 行数。如果 ListItemGroup 内没有 ListItem,则整个 ListItemGroup 算一行。

List 下嵌套使用 LazyForEach,并且 LazyForEach 下嵌套使用 ListItemGroup 时,LazyForEach 会在 List 显示区域外上下各会创建 cachedCount 个 ListItemGroup。

二、ohos.data.preferences (用户首选项)

  • getPreferences(context: Context, name: string): Promise:获取 Preferences 实例,使用 Promise 异步回调。
  • getPreferences(context: Context, options: Options, callback: AsyncCallback): void:获取 Preferences 实例,使用 callback 异步回调。
  • getPreferencesSync(context: Context, options: Options): Preferences:获取 Preferences 实例,此为同步接口。

三、@Builder 装饰器:自定义构建函数

装饰器使用说明 @Builder 装饰器有两种使用方式,分别是定义在自定义组件内部的私有自定义构建函数和定义在全局的全局自定义构建函数。

使用方法: 允许在自定义组件内定义一个或多个@Builder 函数,该函数被认为是该组件的私有、特殊类型的成员函数。 私有自定义构建函数允许在自定义组件内、build 函数和其他自定义构建函数中调用。 在自定义组件中,this 指代当前所属组件,组件的状态变量可在自定义构建函数内访问。建议通过 this 访问组件的状态变量,而不是通过参数传递。

四、User-Agent 开发指导

通过 setCustomUserAgent() 接口设置自定义用户代理,但请注意,此操作会覆盖系统的用户代理。因此,我们建议将扩展字段追加在默认用户代理的末尾,比如三方应用程序的开发场景,可以在系统默认用户代理字符串的末尾追加特定的 APP 标识,这样既能保留原有用户代理信息,又能增加自定义的应用识别信息。

当 Web 组件 src 设置了 url 时,建议在onControllerAttached回调事件中设置 User-Agent,设置方式请参考示例。不建议将 User-Agent 设置在 onLoadIntercept 回调事件中,会概率性出现设置失败。如果未在 onControllerAttached 回调事件中设置 User-Agent,再调用 setCustomUserAgent 方法时,可能会出现加载的页面与实际设置 User-Agent 不符的异常现象。

当 Web 组件 src 设置为空字符串时,建议先调用 setCustomUserAgent 方法设置 User-Agent,再通过 loadUrl 加载具体页面。

五、Profile Manager

在 Create Profile 界面,填写新增设备的信息,如 Profile ID(设备型号)、Device type(设备类型)、Resolution(分辨率)和 Language and region(语言和区域)等。其中 Device type 只能选择 module.json5 中 deviceTypes 字段已定义的设备。

六、UIAbility 组件启动模式

singleton(单实例模式)、multiton(多实例模式)、specified(指定实例模式)。 说明:standard 是 multiton 的曾用名,效果与多实例模式一致。

如果需要使用 singleton 启动模式,在 module.json5 配置文件中的 launchType 字段配置为 singleton 即可。

{
  "module": 
     
      
         
      
    
  

{
"abilities"
:
[
{
"launchType"
:
"singleton"
}
]
}
}

multiton 启动模式为多实例模式,每次调用 startAbility() 方法时,都会在应用进程中创建一个新的该类型 UIAbility 实例。即在最近任务列表中可以看到有多个该类型的 UIAbility 实例。这种情况下可以将 UIAbility 配置为 multiton(多实例模式)。

specified 启动模式 specified 启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。

七、HTTP 数据请求

设置请求方式 支持 GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 方法,默认为 GET。

  1. 创建 HttpRequest 对象 调用 createHttp() 方法,创建 HttpRequest 对象。 提醒:每一个 httpRequest 对应一个 HTTP 请求任务,不可复用。
let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
let httpRequest = http.createHttp();
  1. 订阅 HTTP 响应头事件 调用该对象的 on() 方法,订阅 HTTP 响应头事件,此接口会比 request 请求先返回。可以根据业务需要订阅此消息。
// 从 API 8 开始,使用 on('headersReceive', Callback) 替代 on('headerReceive', AsyncCallback)
httpRequest.on('headersReceive', (header) => {
  console.info('header: ' + JSON.stringify(header));
});
  1. 发起 HTTP 请求,解析服务器响应事件 调用该对象的 request() 方法,传入 HTTP 请求的 url 地址和可选参数,发起网络请求,按照实际业务需要,解析返回结果。
httpRequest.request(
  "EXAMPLE_URL",
  {
    method: http.RequestMethod.POST,
    header: { 'Content-Type': 'application/json' },
    extraData: "data to send",
    expectDataType: http.HttpDataType.STRING,
    usingCache: true,
    priority: 1,
    connectTimeout: 60000,
    readTimeout: 60000,
    usingProtocol: http.HttpProtocol.HTTP1_1,
    usingProxy: false,
    caPath: '/path/to/cacert.pem',
    clientCert: {
      certPath: '/path/to/client.pem',
      keyPath: '/path/to/client.key',
      certType: http.CertType.PEM,
      keyPassword: "passwordToKey"
    },
    multiFormDataList: [
      {
        name: "Part1",
        contentType: 'text/plain',
        data: 'Example data',
        remoteFileName: 'example.txt'
      },
      {
        name: "Part2",
        contentType: 'text/plain',
        filePath: `${context.filesDir}/fileName.txt`,
        remoteFileName: 'fileName.txt'
      }
    ]
  },
  (err: BusinessError, data: http.HttpResponse) => {
    if (!err) {
      console.info('Result:' + JSON.stringify(data.result));
      console.info('code:' + JSON.stringify(data.responseCode));
      console.info('header:' + JSON.stringify(data.header));
      console.info('cookies:' + JSON.stringify(data.cookies));
      // 8+
      // 当该请求使用完毕时,调用 destroy 方法主动销毁。
      httpRequest.destroy();
    } else {
      console.error('error:' + JSON.stringify(err));
      // 取消订阅 HTTP 响应头事件。
      httpRequest.off('headersReceive');
      // 当该请求使用完毕时,调用 destroy 方法主动销毁。
      httpRequest.destroy();
    }
  }
);

八、RichEditor

参考官方文档了解富文本编辑器组件的使用。

九、安全控件通用属性

markAnchor(value: Position): T 设置安全控件在位置定位时的锚点,以控件左上角作为基准点进行偏移。

十、背景设置

backgroundBrightness(params: BackgroundBrightnessOptions): T 设置组件背景提亮效果。 BackgroundBrightnessOptions: 设置组件背景提亮效果,包括:亮度变化速率,提亮程度。

十一、多设备交互

焦点导航事件适配 使用键盘、电视遥控器、车机摇杆或旋钮等非指向性输入设备与应用程序进行间接交互时,建议将页面中可操作元素设置为可获焦状态,并配置获焦视觉效果,以保证交互体验。

获焦:组件获焦时,遵循子组件优先原则。若子组件需获焦,其所有祖先组件均需可获焦。容器组件需获焦时,其子组件应不可获焦,并配置点击事件。 部分组件默认可获焦,如 Button、TextInput 等基础组件和 Column、Row 等容器组件。若组件有获焦能力但默认不可获焦,如 Text、Image 等组件,可设置通用属性 focusable(true) 使其可获焦。 走焦:触发走焦时,系统遍历组件树中可走焦的组件。不同按键触发不同的走焦逻辑。例如,TAB 键走焦遵循 Z 字型遍历逻辑;方向键走焦遵循十字型移动逻辑。除了系统默认的走焦逻辑,开发者可以通过 tabIndex 自定义走焦逻辑。

十二、应用上下文 Context

el1 与 el2 文件之间的区别 三级目录 el1/和 el2/:代表不同文件加密类型。 el1(设备级加密区):设备开机后可访问的数据区。 el2(用户级加密区):设备开机后,需解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)至少一次,才能访问加密数据区。 应用若无特殊需求,应将数据存放在 EL2 加密目录下,以保障数据安全。对于需要在用户解锁前访问的文件,如时钟、闹铃、壁纸等,应将这些文件存放在设备级加密区(EL1)。

获取和修改加密分区 应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。在不同的场景下,应用需要不同程度的文件保护。 在实际应用中,开发者需要根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。通过合理使用不同级别的加密分区,可以有效提升应用数据的安全性。关于不同分区的权限说明,详见 ContextConstant 的 AreaMode。

  • EL1:对于私有文件,如闹铃、壁纸等,应用可以将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问。
  • EL2:对于更敏感的文件,如个人隐私信息等,应用可以将这些文件放到更高级别的加密分区(EL2)中,以保证更高的安全性。
  • EL3:对于应用中的记录步数、文件下载、音乐播放,需要在锁屏时读写和创建新文件,放在(EL3)的加密分区比较合适。
  • EL4:对于用户安全信息相关的文件,锁屏时不需要读写文件、也不能创建文件,放在(EL4)的加密分区更合适。
  • EL5:对于用户隐私敏感数据文件,锁屏后默认不可读写,如果锁屏后需要读写文件,则锁屏前可以调用 Access 接口申请继续读写文件,或者锁屏后也需要创建新文件且可读写,放在(EL5)的应用级加密分区更合适。

要实现获取和设置当前加密分区,可以通过读写 Context 的 area 属性来实现。

// EntryAbility.ets
import { UIAbility, contextConstant, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 存储普通信息前,切换到 EL1 设备级加密
    this.context.area = contextConstant.AreaMode.EL1;
    // 存储普通信息
    // 存储敏感信息前,切换到 EL2 用户级加密
    this.context.area = contextConstant.AreaMode.EL2;
    // 存储敏感信息
    // 存储敏感信息前,切换到 EL3 用户级加密
    this.context.area = contextConstant.AreaMode.EL3;
    // 存储敏感信息
    // 存储敏感信息前,切换到 EL4 用户级加密
    this.context.area = contextConstant.AreaMode.EL4;
    // 存储敏感信息
    // 存储敏感信息前,切换到 EL5 应用级加密
    this.context.area = contextConstant.AreaMode.EL5;
    // 存储敏感信息
  }
}
// Index.ets
import { contextConstant, common } from '@kit.AbilityKit';
@Entry @Component
struct Page_Context {
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  build() {
    Column() {
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            // ...
          }.onClick(() => {
            // 存储普通信息前,切换到 EL1 设备级加密
            if (this.context.area === contextConstant.AreaMode.EL2) {
              // 获取 area
              this.context.area = contextConstant.AreaMode.EL1;
              // 修改 area
              this.getUIContext().getPromptAction().showToast({ message: 'SwitchToEL1' });
            }
            // 存储普通信息
          })
        }
        ListItem() {
          Row() {
            // ...
          }.onClick(() => {
            // 存储敏感信息前,切换到 EL2 用户级加密
            if (this.context.area === contextConstant.AreaMode.EL1) {
              // 获取 area
              this.context.area = contextConstant.AreaMode.EL2;
              // 修改 area
              this.getUIContext().getPromptAction().showToast({ message: 'SwitchToEL2' });
            }
            // 存储敏感信息
          })
        }
      }
    }
  }
}

十三、image

object-fit 类型说明

类型描述
cover保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界,居中显示。
contain保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内,居中显示。
fill不保持宽高比进行放大缩小,使得图片填充满显示边界。
none保持原有尺寸进行居中显示。
scale-down保持宽高比居中显示,图片缩小或者保持不变。

目录

  1. 一、LazyForEach: 数据懒加载
  2. 二、ohos.data.preferences (用户首选项)
  3. 三、@Builder 装饰器:自定义构建函数
  4. 四、User-Agent 开发指导
  5. 五、Profile Manager
  6. 六、UIAbility 组件启动模式
  7. 七、HTTP 数据请求
  8. 八、RichEditor
  9. 九、安全控件通用属性
  10. 十、背景设置
  11. 十一、多设备交互
  12. 十二、应用上下文 Context
  13. 十三、image
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 归并排序:基于分治法的高效排序算法
  • AI 大模型核心技术:CoT 思维链与 ReAct 推理行动
  • 多模态大模型垂直微调:基于 Qwen3-VL-4B-Thinking 与 Llama Factory
  • 前端高频面试题:TypeScript 核心考点与实战
  • Qwen2.5-7B 高性能 Web 推理服务部署指南
  • SOFATracer 分布式链路追踪组件剖析
  • C# 与 C++ 开发的 OPC DA SERVER 软件实践
  • 基于 MCP 协议的智能体落地示例:天气预报工具实现
  • AI 在数据库操作中的应用场景与实践指南
  • OpenClaw 自动化 AI 智能体跨平台部署与日常使用教程
  • 从零搭建 SpringBoot 项目详解
  • Wi-Fi 7 轻量化应用:智能家居与物联网的可落地时代
  • Java 工程师转行 AI 大模型实战经验与学习路径分享
  • 字节 Trae 腾讯 CodeBuddy 阿里 Qoder 集成 OneCode 低代码平台对比
  • Trae 集成图片素描 MCP 工具实现多风格素描转换
  • IntelliJ IDEA 常用快捷键指南
  • 在线学生成绩综合统计分析系统的设计与实现
  • Windows WSL 环境下 AMD 显卡部署 Stable Diffusion WebUI 与 ComfyUI
  • Go 语言工程师如何进阶为云原生高级开发工程师
  • MCP 插件配置与使用:以 browser-tools-mcp 为例

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online