🔥 2026 鸿蒙原生开发 (ArkTS) 面试通关指南:精选 50 题

本文基于 HarmonyOS NEXT (API 11/12+) 编写,摒弃了兼容安卓的旧 Java/JS 知识体系,纯粹聚焦于 ArkTS、ArkUI、Stage 模型及底层原理。


🛠️ 第一章:ArkTS 语言基础 (8题)

考察对开发语言的理解深度。

  1. ⭐ 什么是 ArkTS?它与 TS、JS 的关系?
  • :ArkTS 是 TS 的超集(保留静态类型)+ UI 扩展(声明式语法),同时也是 TS 的子集(为了性能,禁止了 any、动态类型修改等)。
  1. ⭐⭐ 为什么 ArkTS 禁止使用 any 类型?
  • :为了支持 AOT(Ahead-Of-Time)预编译。确定类型后,编译器可以直接生成机器码,无需运行时进行类型推导,大幅提升启动和运行速度。
  1. structclass 在 ArkTS 组件中的区别?
  • :自定义组件必须用 struct 定义,不可继承;纯逻辑类可以用 class
  1. ⭐⭐ @Builder@BuilderParam 的作用?
  • @Builder 用于提取 UI 逻辑,实现轻量级复用;@BuilderParam 类似 React 的 render props 或 Vue 的 slot,让父组件可以向子组件传递 UI 内容。
  1. ⭐⭐⭐ @Styles@Extend 有什么区别?
  • @Styles 是通用属性集合(如 .width, .height);@Extend 是针对特定组件(如 Text, Button)的私有属性扩展(如 .fontColor)。
  1. ⭐⭐ ArkTS 中的 foreachLazyForEach 区别?
  • ForEach 全量渲染,适合少量数据;LazyForEach 按需渲染,配合 IDataSource 使用,长列表必用。
  1. ⭐⭐⭐ 什么是闭包(Closure)?在 ArkTS 中有什么坑?
  • :坑点在于 this 指向。在回调函数中访问组件状态时,建议使用箭头函数 () => {} 来绑定上下文。
  1. ⭐⭐ 接口(Interface)和类型别名(Type)怎么选?
  • :定义对象结构优先用 Interface(支持合并);定义联合类型或基本类型别名用 Type

📱 第二章:ArkUI 与 布局渲染 (10题)

考察画界面的能力,重点是渲染流程和布局算法。

  1. ⭐ 请列举 5 种常用布局容器?
  • Column (垂直), Row (水平), Stack (层叠), Flex (弹性), RelativeContainer (相对).
  1. ⭐⭐ RelativeContainer 解决了什么痛点?
  • :解决了嵌套过深的问题。通过锚点(Anchor)定位,减少布局层级,提升渲染性能。
  1. ⭐⭐⭐ 自定义组件的生命周期有哪些?
  • aboutToAppear (创建后,Build前), build (渲染), aboutToDisappear (销毁前)。页面级组件多出 onPageShow, onPageHide, onBackPress
  1. ⭐⭐⭐ build() 函数内有什么限制?
  • :不能写 console.log,不能定义局部变量,不能直接调用没有 @Builder 装饰的函数。
  1. ⭐⭐ Blank 组件的作用?
  • :在 RowColumn 中自动填充剩余空间,常用于“左边文字-右边图标”的布局。
  1. ⭐⭐⭐ 什么是“系统栏避让”?如何实现沉浸式状态栏?
  • :使用 window.setWindowLayoutFullScreen(true) 开启全屏,并通过 AppStorage 获取 systemSafeArea 高度来设置 Padding,防止内容被刘海屏遮挡。
  1. ⭐⭐⭐ 如何获取组件的宽高(组件布局后的尺寸)?
  • :使用 onAreaChange((oldValue, newValue) => {}) 回调。
  1. ⭐⭐⭐⭐ ArkUI 的渲染三棵树是什么?(原理题)
  • :逻辑树 (ViewTree) -> 渲染树 (RenderTree) -> 节点树 (LayerTree/RSNode)。
  1. ⭐⭐ 什么是 if / elseVisibility 的区别?
  • if/else 会真正的创建/销毁组件节点(消耗大);Visibility.None 只是隐藏(节点还在),频繁切换显隐建议用 Visibility
  1. ⭐⭐⭐ 怎么实现一个复杂的自定义弹窗?
  • :使用 CustomDialogController,传入 builder 自定义布局。

🔄 第三章:状态管理 (核心重灾区) (8题)

这是鸿蒙开发的灵魂,一定要讲透。

  1. ⭐ 请用一句话描述 ArkUI 的状态驱动机制?
  • :数据变化 -> 触发监听 -> 标记脏节点 -> 重新执行 Build -> 刷新 UI。
  1. ⭐⭐ @State, @Prop, @Link 的区别(必考)?
  • @State (自身管理), @Prop (单向拷贝), @Link (双向引用)。
  1. ⭐⭐⭐ 为什么数组中的对象属性改变了,UI 没刷新?
  • @State 只能观察到数组本身的增删(push/pop)和对象第一层的变化。嵌套对象的属性变化需要配合 @Observed (类装饰) 和 @ObjectLink (组件接收)。
  1. ⭐⭐⭐ @Provide@Consume 的使用场景?
  • :跨组件层级通信(爷孙通信)。无需一层层传参,爷爷 Provide,孙子 Consume 即可。
  1. ⭐⭐ AppStorageLocalStorage 的区别?
  • AppStorage 是应用全局的单例,所有 UIAbility 共享;LocalStorage 是页面级或 UIAbility 级的,用于多窗口间的数据隔离。
  1. ⭐⭐⭐⭐ 什么是 PersistentStorage?它是数据库吗?
  • :不是数据库,是持久化 UI 状态(写入磁盘的 XML/Preferences)。千万不要存大量数据,会卡死 UI 主线程,它只能存简单的用户偏好设置。
  1. ⭐⭐⭐ @Watch 装饰器的作用?
  • :监听状态变量的变化,并在变化时执行特定的逻辑函数(如数据变了自动请求网络)。
  1. ⭐⭐⭐⭐⭐ (进阶) 谈谈 ArkUI 状态管理 V2 (ObservedV2)?
  • :API 12 推出的新能力,使用 @Trace 深度监听,无需 @ObjectLink 也能实现深层数据更新,性能更好,颗粒度更细。

🚀 第四章:Stage 模型与系统能力 (8题)

从应用架构层面考察。

  1. ⭐ 解释一下 UIAbility?
  • :包含 UI 的应用组件,是系统调度的基本单元(类似于 Android Activity)。
  1. ⭐⭐ UIAbility 的启动模式(LaunchMode)有哪些?
  • Singleton (单实例,默认), Standard (多实例), Specified (指定实例)。
  1. ⭐⭐⭐ 什么是 Context?ApplicationContext 和 UIAbilityContext 的区别?
  • :Context 是应用上下文。ApplicationContext 全局唯一,适合订阅公共事件;UIAbilityContext 绑定当前窗口,适合跳转页面、开启弹窗。
  1. ⭐⭐ 页面路由:Router vs Navigation
  • 强烈推荐 Navigation。Router 是页面栈(不好做动效和传递复杂对象);Navigation 是组件级路由,支持分栏,适合折叠屏。
  1. ⭐⭐⭐ 怎么实现跨 Ability 跳转(如跳转到设置页)?
  • :使用 startAbility,构造 Want 对象(指定 bundleName, abilityName)。
  1. ⭐⭐ 什么是 ExtensionAbility?举例?
  • :面向特定场景的组件。如 FormExtension (卡片), WorkSchedulerExtension (后台任务), InputMethodExtension (输入法)。
  1. ⭐⭐⭐ 鸿蒙的权限申请流程?
  • :module.json5 声明 -> 运行时检查 (checkAccessToken) -> 动态申请 (requestPermissionsFromUser)。
  1. ⭐⭐ 后台任务如何保活?
  • :申请后台模式(Background Mode),如音频播放、定位、下载等。鸿蒙对后台查杀很严,普通应用切后台几秒后就会被挂起。

⚡ 第五章:并发与网络 (6题)

考察解决“卡顿”问题的能力。

  1. ⭐⭐⭐ 鸿蒙的线程模型(Actor Model)与 Java/Android 有什么不同?
  • :鸿蒙线程间内存不共享。不能直接读写全局变量,必须通过消息传递(序列化)通信,避免了锁竞争问题。
  1. ⭐⭐ TaskPool 和 Worker 的区别?
  • TaskPool(系统管理,适合短时任务,推荐);Worker(手动管理,适合长时任务,有数量限制)。
  1. ⭐⭐ 主线程(UI线程)卡死的原因通常有哪些?
  • :在 aboutToAppear 或点击事件中进行了同步的 I/O 操作、复杂的 JSON 解析或大量计算。
  1. ⭐⭐ 如何发起 HTTP 请求?
  • :使用 @kit.NetworkKit 中的 http.createHttp()。记得处理 destroy() 防止内存泄漏。
  1. ⭐⭐⭐ 多个网络请求并发如何处理?
  • :使用 Promise.all()async/await
  1. ⭐⭐ 怎么传输大文件(如 1GB 视频)?
  • :必须使用 request 模块(上传下载代理服务),由系统服务在后台代理传输,否则应用切后台会被断网。

💾 第六章:数据与存储 (5题)

  1. ⭐ 鸿蒙有哪些数据存储方式?
  • :Preferences (首选项, Key-Value), KV-Store (分布式键值), RDB (关系型数据库/SQLite), File (文件存储)。
  1. ⭐⭐ Preferences 适合存什么?
  • :用户设置、Token、字体大小。不要存列表数据。
  1. ⭐⭐⭐ RDB (SQLite) 开发流程?
  • :定义 StoreConfig -> 获取 RdbStore -> executeSql 建表 -> insert/query 操作 -> Predicates 构建查询条件。
  1. ⭐⭐ 如何访问相册图片?
  • :使用 PhotoViewPicker 拉起系统选择器,获取 uri,注意 uri 需要通过 fileIo 读取,不能直接作为路径。
  1. ⭐⭐ RawFile 和 Resource 的区别?
  • rawfile (原生文件,需手动读流);resource (编译过的资源,通过 $r 引用,支持多语言/多设备自动适配)。

🛠️ 第七章:工程化与打包 (5题)

大厂面试必问的架构题。

  1. ⭐⭐ HAP, HAR, HSP 的区别(经典题)?
  • :HAP (应用包), HAR (静态共享包, 编译时拷贝), HSP (动态共享包, 运行时共享)。
  1. ⭐⭐⭐ 什么时候用 HSP?
  • :当多个 HAP 模块共用一个体积较大的公共库时,用 HSP 避免代码重复打包,减小体积。
  1. ⭐⭐ 如何进行多设备适配(手机/折叠屏/平板)?
  • :断点系统 (Breakpoints) + 栅格布局 (GridRow) + 资源限定词 (zh-rCN-tablet)。
  1. ⭐⭐ 鸿蒙应用的签名流程?
  • :生成密钥库 (.p12) -> 生成证书请求 (.csr) -> 申请调试证书 (.cer) -> 注册设备 -> 生成 Profile (.p7b)。
  1. ⭐⭐ 什么是 HVIGOR?
  • :基于 TypeScript 的构建工具(类似 Gradle),用于自动化构建、打包、任务管理。

以上是本人面试总结,如果有其他的面试题,或者对解答不合理的可以打在评论区,一起学习,谢谢


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐