跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端

鸿蒙原生开发 (ArkTS) 面试指南:50 题

鸿蒙原生开发(ArkTS)的 50 道面试精选题目,涵盖语言基础、ArkUI 布局渲染、状态管理、Stage 模型与系统能力、并发网络、数据存储及工程化打包等核心领域。内容基于 HarmonyOS NEXT (API 11/12+),重点解析 ArkTS 特性、声明式 UI 原理、状态驱动机制及跨进程通信等关键技术点,旨在帮助开发者系统复习并应对技术面试。

日志猎手发布于 2026/3/28更新于 2026/7/2063 浏览

鸿蒙原生开发 (ArkTS) 面试指南:50 题

基于 HarmonyOS NEXT (API 11/12+) 编写,聚焦于 ArkTS、ArkUI、Stage 模型及底层原理。

ArkTS 语言基础

  1. 什么是 ArkTS?它与 TS、JS 的关系?

    • 答:ArkTS 是 TS 的超集(保留静态类型)+ UI 扩展(声明式语法),同时也是 TS 的子集(为了性能,禁止了 any、动态类型修改等)。
  2. 为什么 ArkTS 禁止使用 any 类型?

    • 答:为了支持 AOT(Ahead-Of-Time)预编译。确定类型后,编译器可以直接生成机器码,无需运行时进行类型推导,大幅提升启动和运行速度。
  3. struct 和 class 在 ArkTS 组件中的区别?

    • 答:自定义组件必须用 struct 定义,不可继承;纯逻辑类可以用 class。
  4. @Builder 和 @BuilderParam 的作用?

    • 答:@Builder 用于提取 UI 逻辑,实现轻量级复用;@BuilderParam 类似 React 的 render props 或 Vue 的 slot,让父组件可以向子组件传递 UI 内容。
  5. @Styles 和 @Extend 有什么区别?

    • 答:@Styles 是通用属性集合(如 .width, .height);@Extend 是针对特定组件(如 Text, Button)的私有属性扩展(如 .fontColor)。
  6. ArkTS 中的 foreach 和 LazyForEach 区别?

    • 答:ForEach 全量渲染,适合少量数据;LazyForEach 按需渲染,配合 IDataSource 使用,长列表必用。
  7. 什么是闭包(Closure)?在 ArkTS 中有什么坑?

    • 答:坑点在于 this 指向。在回调函数中访问组件状态时,建议使用箭头函数 () => {} 来绑定上下文。
  8. 接口(Interface)和类型别名(Type)怎么选?

    • 答:定义对象结构优先用 Interface(支持合并);定义联合类型或基本类型别名用 Type。

ArkUI 与 布局渲染

  1. 请列举 5 种常用布局容器?

    • 答:Column (垂直), Row (水平), Stack (层叠), Flex (弹性), RelativeContainer (相对).
  2. RelativeContainer 解决了什么痛点?

  • 答:解决了嵌套过深的问题。通过锚点(Anchor)定位,减少布局层级,提升渲染性能。
  • 自定义组件的生命周期有哪些?

    • 答:aboutToAppear (创建后,Build 前), build (渲染), aboutToDisappear (销毁前)。页面级组件多出 onPageShow, onPageHide, onBackPress。
  • build() 函数内有什么限制?

    • 答:不能写 console.log,不能定义局部变量,不能直接调用没有 @Builder 装饰的函数。
  • Blank 组件的作用?

    • 答:在 Row 或 Column 中自动填充剩余空间,常用于'左边文字 - 右边图标'的布局。
  • 什么是'系统栏避让'?如何实现沉浸式状态栏?

    • 答:使用 window.setWindowLayoutFullScreen(true) 开启全屏,并通过 AppStorage 获取 systemSafeArea 高度来设置 Padding,防止内容被刘海屏遮挡。
  • 如何获取组件的宽高(组件布局后的尺寸)?

    • 答:使用 onAreaChange((oldValue, newValue) => {}) 回调。
  • ArkUI 的渲染三棵树是什么?(原理题)

    • 答:逻辑树 (ViewTree) -> 渲染树 (RenderTree) -> 节点树 (LayerTree/RSNode)。
  • 什么是 if / else 和 Visibility 的区别?

    • 答:if/else 会真正的创建/销毁组件节点(消耗大);Visibility.None 只是隐藏(节点还在),频繁切换显隐建议用 Visibility。
  • 怎么实现一个复杂的自定义弹窗?

    • 答:使用 CustomDialogController,传入 builder 自定义布局。
  • 状态管理

    1. 请用一句话描述 ArkUI 的状态驱动机制?

      • 答:数据变化 -> 触发监听 -> 标记脏节点 -> 重新执行 Build -> 刷新 UI。
    2. @State, @Prop, @Link 的区别(必考)?

      • 答:@State (自身管理), @Prop (单向拷贝), @Link (双向引用)。
    3. 为什么数组中的对象属性改变了,UI 没刷新?

      • 答:@State 只能观察到数组本身的增删(push/pop)和对象第一层的变化。嵌套对象的属性变化需要配合 @Observed (类装饰) 和 @ObjectLink (组件接收)。
    4. @Provide 和 @Consume 的使用场景?

      • 答:跨组件层级通信(爷孙通信)。无需一层层传参,爷爷 Provide,孙子 Consume 即可。
    5. AppStorage 和 LocalStorage 的区别?

      • 答:AppStorage 是应用全局的单例,所有 UIAbility 共享;LocalStorage 是页面级或 UIAbility 级的,用于多窗口间的数据隔离。
    6. 什么是 PersistentStorage?它是数据库吗?

      • 答:不是数据库,是持久化 UI 状态(写入磁盘的 XML/Preferences)。千万不要存大量数据,会卡死 UI 主线程,它只能存简单的用户偏好设置。
    7. @Watch 装饰器的作用?

      • 答:监听状态变量的变化,并在变化时执行特定的逻辑函数(如数据变了自动请求网络)。
    8. 谈谈 ArkUI 状态管理 V2 (ObservedV2)?

      • 答:API 12 推出的新能力,使用 @Trace 深度监听,无需 @ObjectLink 也能实现深层数据更新,性能更好,颗粒度更细。

    Stage 模型与系统能力

    1. 解释一下 UIAbility?

      • 答:包含 UI 的应用组件,是系统调度的基本单元(类似于 Android Activity)。
    2. UIAbility 的启动模式(LaunchMode)有哪些?

      • 答:Singleton (单实例,默认), Standard (多实例), Specified (指定实例)。
    3. 什么是 Context?ApplicationContext 和 UIAbilityContext 的区别?

      • 答:Context 是应用上下文。ApplicationContext 全局唯一,适合订阅公共事件;UIAbilityContext 绑定当前窗口,适合跳转页面、开启弹窗。
    4. 页面路由:Router vs Navigation?

      • 答:强烈推荐 Navigation。Router 是页面栈(不好做动效和传递复杂对象);Navigation 是组件级路由,支持分栏,适合折叠屏。
    5. 怎么实现跨 Ability 跳转(如跳转到设置页)?

      • 答:使用 startAbility,构造 Want 对象(指定 bundleName, abilityName)。
    6. 什么是 ExtensionAbility?举例?

      • 答:面向特定场景的组件。如 FormExtension (卡片), WorkSchedulerExtension (后台任务), InputMethodExtension (输入法)。
    7. 鸿蒙的权限申请流程?

      • 答:module.json5 声明 -> 运行时检查 (checkAccessToken) -> 动态申请 (requestPermissionsFromUser)。
    8. 后台任务如何保活?

      • 答:申请后台模式(Background Mode),如音频播放、定位、下载等。鸿蒙对后台查杀很严,普通应用切后台几秒后就会被挂起。

    并发与网络

    1. 鸿蒙的线程模型(Actor Model)与 Java/Android 有什么不同?

      • 答:鸿蒙线程间内存不共享。不能直接读写全局变量,必须通过消息传递(序列化)通信,避免了锁竞争问题。
    2. TaskPool 和 Worker 的区别?

      • 答:TaskPool(系统管理,适合短时任务,推荐);Worker(手动管理,适合长时任务,有数量限制)。
    3. 主线程(UI 线程)卡死的原因通常有哪些?

      • 答:在 aboutToAppear 或点击事件中进行了同步的 I/O 操作、复杂的 JSON 解析或大量计算。
    4. 如何发起 HTTP 请求?

      • 答:使用 @kit.NetworkKit 中的 http.createHttp()。记得处理 destroy() 防止内存泄漏。
    5. 多个网络请求并发如何处理?

      • 答:使用 Promise.all() 或 async/await。
    6. 怎么传输大文件(如 1GB 视频)?

      • 答:必须使用 request 模块(上传下载代理服务),由系统服务在后台代理传输,否则应用切后台会被断网。

    数据与存储

    1. 鸿蒙有哪些数据存储方式?

      • 答:Preferences (首选项,Key-Value), KV-Store (分布式键值), RDB (关系型数据库/SQLite), File (文件存储)。
    2. Preferences 适合存什么?

      • 答:用户设置、Token、字体大小。不要存列表数据。
    3. RDB (SQLite) 开发流程?

      • 答:定义 StoreConfig -> 获取 RdbStore -> executeSql 建表 -> insert/query 操作 -> Predicates 构建查询条件。
    4. 如何访问相册图片?

      • 答:使用 PhotoViewPicker 拉起系统选择器,获取 uri,注意 uri 需要通过 fileIo 读取,不能直接作为路径。
    5. RawFile 和 Resource 的区别?

      • 答:rawfile (原生文件,需手动读流);resource (编译过的资源,通过 $r 引用,支持多语言/多设备自动适配)。

    工程化与打包

    1. HAP, HAR, HSP 的区别(经典题)?

      • 答:HAP (应用包), HAR (静态共享包,编译时拷贝), HSP (动态共享包,运行时共享)。
    2. 什么时候用 HSP?

      • 答:当多个 HAP 模块共用一个体积较大的公共库时,用 HSP 避免代码重复打包,减小体积。
    3. 如何进行多设备适配(手机/折叠屏/平板)?

      • 答:断点系统 (Breakpoints) + 栅格布局 (GridRow) + 资源限定词 (zh-rCN-tablet)。
    4. 鸿蒙应用的签名流程?

      • 答:生成密钥库 (.p12) -> 生成证书请求 (.csr) -> 申请调试证书 (.cer) -> 注册设备 -> 生成 Profile (.p7b)。
    5. 什么是 HVIGOR?

      • 答:基于 TypeScript 的构建工具(类似 Gradle),用于自动化构建、打包、任务管理。

    目录

    1. 鸿蒙原生开发 (ArkTS) 面试指南:50 题
    2. ArkTS 语言基础
    3. ArkUI 与 布局渲染
    4. 状态管理
    5. Stage 模型与系统能力
    6. 并发与网络
    7. 数据与存储
    8. 工程化与打包
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

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

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

    更多推荐文章

    查看全部
    • 大模型时代的智能体(Agent)技术解析
    • Linux 进程信号机制:产生方式与闹钟应用
    • Nginx 部署前端 Vue 项目
    • C++ AVL 树详解:概念、插入与旋转操作
    • Apache IoTDB 高性能存储引擎与工业级架构解析
    • 25 个简短且实用的 Python 代码片段
    • 数据结构:查找算法与二叉排序树详解
    • PyCharm 2023.2 简介、下载与安装指南
    • AI 产品经理转行大模型:核心能力与实战指南
    • OpenClaw 多智能体路由实战:飞书多机器人配置指南
    • Amazon DocumentDB Serverless 架构特性与弹性扩缩容指南
    • 基于 AI 辅助开发的在线图书借阅平台实践指南:从 0 到 1
    • 中文类 LLaMA 大语言模型资源整理与对比
    • JDK 21 安装与环境变量配置指南(Windows 版)
    • OpenClaw 框架 30+ 真实场景应用拆解
    • OpenClaw 免费 AI 大模型配置方法
    • Java 数据结构实战:二叉树与哈希表详解
    • 10款AI降重工具精选:轻松通过AIGC检测的专业方案
    • C++ 性能优化实战:内存、CPU 与 I/O 效率提升
    • 算法解析:找到字符串中所有字母异位词

    相关免费在线工具

    • 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