2026 鸿蒙原生开发 (ArkTS) 面试通关指南:精选 50 题
2026鸿蒙原生开发(ArkTS)面试指南:精选50题解析 本文聚焦HarmonyOS NEXT(API 11/12+)开发,涵盖六大核心领域: ArkTS语言基础:解析ArkTS与TS/JS关系,重点说明禁止any类型的原因及struct/class区别,介绍装饰器(@Builder/@Styles)用法 ArkUI与布局:详细讲解5种常用布局容器、组件生命周期、系统栏避让实现和渲染三棵树原理
·
🔥 2026 鸿蒙原生开发 (ArkTS) 面试通关指南:精选 50 题
本文基于 HarmonyOS NEXT (API 11/12+) 编写,摒弃了兼容安卓的旧 Java/JS 知识体系,纯粹聚焦于 ArkTS、ArkUI、Stage 模型及底层原理。
🛠️ 第一章:ArkTS 语言基础 (8题)
考察对开发语言的理解深度。
- ⭐ 什么是 ArkTS?它与 TS、JS 的关系?
- 答:ArkTS 是 TS 的超集(保留静态类型)+ UI 扩展(声明式语法),同时也是 TS 的子集(为了性能,禁止了
any、动态类型修改等)。
- ⭐⭐ 为什么 ArkTS 禁止使用
any类型?
- 答:为了支持 AOT(Ahead-Of-Time)预编译。确定类型后,编译器可以直接生成机器码,无需运行时进行类型推导,大幅提升启动和运行速度。
- ⭐
struct和class在 ArkTS 组件中的区别?
- 答:自定义组件必须用
struct定义,不可继承;纯逻辑类可以用class。
- ⭐⭐
@Builder和@BuilderParam的作用?
- 答:
@Builder用于提取 UI 逻辑,实现轻量级复用;@BuilderParam类似 React 的render props或 Vue 的slot,让父组件可以向子组件传递 UI 内容。
- ⭐⭐⭐
@Styles和@Extend有什么区别?
- 答:
@Styles是通用属性集合(如 .width, .height);@Extend是针对特定组件(如 Text, Button)的私有属性扩展(如 .fontColor)。
- ⭐⭐ ArkTS 中的
foreach和LazyForEach区别?
- 答:
ForEach全量渲染,适合少量数据;LazyForEach按需渲染,配合IDataSource使用,长列表必用。
- ⭐⭐⭐ 什么是闭包(Closure)?在 ArkTS 中有什么坑?
- 答:坑点在于
this指向。在回调函数中访问组件状态时,建议使用箭头函数() => {}来绑定上下文。
- ⭐⭐ 接口(Interface)和类型别名(Type)怎么选?
- 答:定义对象结构优先用
Interface(支持合并);定义联合类型或基本类型别名用Type。
📱 第二章:ArkUI 与 布局渲染 (10题)
考察画界面的能力,重点是渲染流程和布局算法。
- ⭐ 请列举 5 种常用布局容器?
- 答:
Column(垂直),Row(水平),Stack(层叠),Flex(弹性),RelativeContainer(相对).
- ⭐⭐
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自定义布局。
🔄 第三章:状态管理 (核心重灾区) (8题)
这是鸿蒙开发的灵魂,一定要讲透。
- ⭐ 请用一句话描述 ArkUI 的状态驱动机制?
- 答:数据变化 -> 触发监听 -> 标记脏节点 -> 重新执行 Build -> 刷新 UI。
- ⭐⭐
@State,@Prop,@Link的区别(必考)?
- 答:
@State(自身管理),@Prop(单向拷贝),@Link(双向引用)。
- ⭐⭐⭐ 为什么数组中的对象属性改变了,UI 没刷新?
- 答:
@State只能观察到数组本身的增删(push/pop)和对象第一层的变化。嵌套对象的属性变化需要配合@Observed(类装饰) 和@ObjectLink(组件接收)。
- ⭐⭐⭐
@Provide和@Consume的使用场景?
- 答:跨组件层级通信(爷孙通信)。无需一层层传参,爷爷 Provide,孙子 Consume 即可。
- ⭐⭐
AppStorage和LocalStorage的区别?
- 答:
AppStorage是应用全局的单例,所有 UIAbility 共享;LocalStorage是页面级或 UIAbility 级的,用于多窗口间的数据隔离。
- ⭐⭐⭐⭐ 什么是
PersistentStorage?它是数据库吗?
- 答:不是数据库,是持久化 UI 状态(写入磁盘的 XML/Preferences)。千万不要存大量数据,会卡死 UI 主线程,它只能存简单的用户偏好设置。
- ⭐⭐⭐
@Watch装饰器的作用?
- 答:监听状态变量的变化,并在变化时执行特定的逻辑函数(如数据变了自动请求网络)。
- ⭐⭐⭐⭐⭐ (进阶) 谈谈 ArkUI 状态管理 V2 (ObservedV2)?
- 答:API 12 推出的新能力,使用
@Trace深度监听,无需@ObjectLink也能实现深层数据更新,性能更好,颗粒度更细。
🚀 第四章:Stage 模型与系统能力 (8题)
从应用架构层面考察。
- ⭐ 解释一下 UIAbility?
- 答:包含 UI 的应用组件,是系统调度的基本单元(类似于 Android Activity)。
- ⭐⭐ UIAbility 的启动模式(LaunchMode)有哪些?
- 答:
Singleton(单实例,默认),Standard(多实例),Specified(指定实例)。
- ⭐⭐⭐ 什么是 Context?ApplicationContext 和 UIAbilityContext 的区别?
- 答:Context 是应用上下文。ApplicationContext 全局唯一,适合订阅公共事件;UIAbilityContext 绑定当前窗口,适合跳转页面、开启弹窗。
- ⭐⭐ 页面路由:
RoutervsNavigation?
- 答:强烈推荐 Navigation。Router 是页面栈(不好做动效和传递复杂对象);Navigation 是组件级路由,支持分栏,适合折叠屏。
- ⭐⭐⭐ 怎么实现跨 Ability 跳转(如跳转到设置页)?
- 答:使用
startAbility,构造Want对象(指定 bundleName, abilityName)。
- ⭐⭐ 什么是 ExtensionAbility?举例?
- 答:面向特定场景的组件。如
FormExtension(卡片),WorkSchedulerExtension(后台任务),InputMethodExtension(输入法)。
- ⭐⭐⭐ 鸿蒙的权限申请流程?
- 答:module.json5 声明 -> 运行时检查 (
checkAccessToken) -> 动态申请 (requestPermissionsFromUser)。
- ⭐⭐ 后台任务如何保活?
- 答:申请后台模式(Background Mode),如音频播放、定位、下载等。鸿蒙对后台查杀很严,普通应用切后台几秒后就会被挂起。
⚡ 第五章:并发与网络 (6题)
考察解决“卡顿”问题的能力。
- ⭐⭐⭐ 鸿蒙的线程模型(Actor Model)与 Java/Android 有什么不同?
- 答:鸿蒙线程间内存不共享。不能直接读写全局变量,必须通过消息传递(序列化)通信,避免了锁竞争问题。
- ⭐⭐ TaskPool 和 Worker 的区别?
- 答:
TaskPool(系统管理,适合短时任务,推荐);Worker(手动管理,适合长时任务,有数量限制)。
- ⭐⭐ 主线程(UI线程)卡死的原因通常有哪些?
- 答:在
aboutToAppear或点击事件中进行了同步的 I/O 操作、复杂的 JSON 解析或大量计算。
- ⭐⭐ 如何发起 HTTP 请求?
- 答:使用
@kit.NetworkKit中的http.createHttp()。记得处理destroy()防止内存泄漏。
- ⭐⭐⭐ 多个网络请求并发如何处理?
- 答:使用
Promise.all()或async/await。
- ⭐⭐ 怎么传输大文件(如 1GB 视频)?
- 答:必须使用
request模块(上传下载代理服务),由系统服务在后台代理传输,否则应用切后台会被断网。
💾 第六章:数据与存储 (5题)
- ⭐ 鸿蒙有哪些数据存储方式?
- 答:Preferences (首选项, Key-Value), KV-Store (分布式键值), RDB (关系型数据库/SQLite), File (文件存储)。
- ⭐⭐ Preferences 适合存什么?
- 答:用户设置、Token、字体大小。不要存列表数据。
- ⭐⭐⭐ RDB (SQLite) 开发流程?
- 答:定义 StoreConfig -> 获取 RdbStore -> executeSql 建表 -> insert/query 操作 -> Predicates 构建查询条件。
- ⭐⭐ 如何访问相册图片?
- 答:使用
PhotoViewPicker拉起系统选择器,获取 uri,注意 uri 需要通过 fileIo 读取,不能直接作为路径。
- ⭐⭐ RawFile 和 Resource 的区别?
- 答:
rawfile(原生文件,需手动读流);resource(编译过的资源,通过 $r 引用,支持多语言/多设备自动适配)。
🛠️ 第七章:工程化与打包 (5题)
大厂面试必问的架构题。
- ⭐⭐ HAP, HAR, HSP 的区别(经典题)?
- 答:HAP (应用包), HAR (静态共享包, 编译时拷贝), HSP (动态共享包, 运行时共享)。
- ⭐⭐⭐ 什么时候用 HSP?
- 答:当多个 HAP 模块共用一个体积较大的公共库时,用 HSP 避免代码重复打包,减小体积。
- ⭐⭐ 如何进行多设备适配(手机/折叠屏/平板)?
- 答:断点系统 (Breakpoints) + 栅格布局 (GridRow) + 资源限定词 (zh-rCN-tablet)。
- ⭐⭐ 鸿蒙应用的签名流程?
- 答:生成密钥库 (.p12) -> 生成证书请求 (.csr) -> 申请调试证书 (.cer) -> 注册设备 -> 生成 Profile (.p7b)。
- ⭐⭐ 什么是 HVIGOR?
- 答:基于 TypeScript 的构建工具(类似 Gradle),用于自动化构建、打包、任务管理。
以上是本人面试总结,如果有其他的面试题,或者对解答不合理的可以打在评论区,一起学习,谢谢
更多推荐


所有评论(0)