HarmonyOS 应用开发者高级认证备考笔记
这篇把 HarmonyOS 应用开发者高级认证(理论考试)的备考内容压成一页:十组必背对比、四条生命周期、35 条高频易错判断、自编自测 12 题。考试规则以华为开发者学堂官方页面为准。
本文首发于我的个人博客,本页为转载,原文链接:https://liupeng.icu/2026/11/02/2026-11-02-harmonyos-advanced-cert-notes/
考试信息
| 项目 | 数值 |
|---|---|
| 时长 | 60 分钟 |
| 满分 / 及格 | 100 / 80 |
| 考试次数 | 每月 3 次 |
| 形式 | 在线客观题(判断 / 单选 / 多选) |
| 前置 | 实名认证 |
及格线是 80 分,多选题通常分值更高且少选错选都不给分,所以别空题,也别说"多选我只敢选一个"——那是策略,不是妥协。
一、ArkTS 与 TypeScript 的差异(禁用清单)
ArkTS 为了编译期能确定对象布局、便于 AOT,砍掉了 TypeScript 里一大票动态特性。这一节几乎每年必考,判断题直接命中。
一禁类型:any、unknown
二禁声明:var(只能 let / const)
三禁动态:运行时增删属性、obj["key"] 动态索引、delete、in(用 instanceof 替代)
四禁反射与元编程:prototype、eval、with、Function.apply/call/bind、TS 实验性装饰器
替代方案记住四个词:明确类型、联合类型、泛型、Map。类型兼容要用名义类型,即显式 implements / extends,光长得一样不算。
二、@State / @Prop / @Link
| 装饰器 | 数据源 | 方向 | 一句话 |
|---|---|---|---|
@State | 组件自身 | 自身 ↔ UI | 私有状态,只观察第一层 |
@Prop | 父组件 | 父 → 子单向 | 子组件改了不回传,对象是深拷贝 |
@Link | 父组件 | 父 ↔ 子双向 | 父用 $ 传引用,子不能本地初始化 |
延伸三个:跨层级用 @Provide + @Consume(双向);观察嵌套对象用 @Observed + @ObjectLink;变化监听 V1 用 @Watch、V2 用 @Monitor。
Storage 一族按作用域记:AppStorage 是应用级内存,PersistentStorage 是应用级持久化,LocalStorage 是页面级。带 Link 的双向,带 Prop 的单向。
三、状态管理 V1 → V2 对照
| V1 | V2 |
|---|---|
@Component | @ComponentV2 |
@State | @Local |
@Prop | @Param(配 @Once) |
@Link | @Param + @Event |
@Provide / @Consume | @Provider / @Consumer |
@Observed + @ObjectLink | @ObservedV2 + @Trace |
@Watch | @Monitor |
| — | @Computed(有缓存,依赖变了才重算) |
硬规则:V1 和 V2 不混用。@Param 是只读的,想改就得通过 @Event 回调父组件,这是 V2 的单向数据流。
四、TaskPool 与 Worker
| 对比 | TaskPool | Worker |
|---|---|---|
| 级别 | 任务级 | 线程级 |
| 线程管理 | 自动 | 手动 |
| 适合 | 短时、独立、CPU 密集 | 长时、常驻、频繁通信 |
| 装饰器 | @Concurrent | — |
| 通信 | 参数 / 返回值 | postMessage / onmessage |
| 数量 | 由任务池调度,优先级 HIGH/MEDIUM/LOW | API 12+ 最多 64 个,旧版 8 个 |
两者共同点:都是 Actor 模型,内存隔离,都不能更新 UI(UI 只在主线程改)。
@Concurrent 修饰的函数四条限制:不能用闭包变量、不能用 this、不能操作 UI、参数和返回值要可序列化。跨线程共享对象用 @Sendable,普通对象默认是序列化拷贝,不是共享引用。
五、HAR、HSP、HAP
| 对比 | HAR | HSP |
|---|---|---|
| 类型 | 静态共享包 | 动态共享包 |
| 共享时机 | 编译时打进 HAP | 运行时共享 |
| 能否独立安装运行 | 否 | 否 |
| 典型用途 | 公共组件、工具 | 多 HAP 复用、压包体积 |
依赖关系一张图:
App Pack(.app,上架)
├─ entry.hap(主模块)
└─ feature.hap(可选功能模块)
HAP → HAR / HSP
HAR → HAR / HSP
HSP → HAR / HSP
HAP ✗→ HAP 共享包:✗ 循环依赖,✗ 依赖传递
.app 用于上架,.hap 用于安装运行;两种共享包都不能独立跑。
六、router 与 Navigation
| 对比 | router | Navigation |
|---|---|---|
| 官方态度 | 旧方案,新应用不推荐 | 推荐 |
| 页面栈 | 系统管理 | NavPathStack |
| 页面载体 | @Entry | NavDestination |
| 多端 | 较弱 | 支持 Stack / Split / Auto 分栏 |
| 系统路由表 | 不支持 | 支持(router_map.json) |
题干出现"推荐"就选 Navigation。
七、数据存储选型
| 方案 | 类型 | 分布式 | 场景 |
|---|---|---|---|
| Preferences | 轻量键值 | 否 | 少量配置、开关、token |
| RDB | 关系型(SQLite) | 否 | 复杂查询、事务、大量结构化数据 |
| KV Store | 键值数据库 | 是 | 跨设备键值数据 |
| 分布式数据对象 | 内存对象 | 是 | 多设备实时协同 |
两个细节:Preferences.put() 之后要 flush() 才落盘;RDB 的 ResultSet 用完要 close()。
八、Stage 模型与 FA 模型
| 对比 | Stage | FA |
|---|---|---|
| 核心单元 | UIAbility / ExtensionAbility | Ability / AbilitySlice |
| 是否推荐 | 是 | 否 |
| 窗口 | WindowStage | AbilitySlice 栈 |
启动模式默认是 singleton(重复拉起复用实例并触发 onNewWant),其余还有 multiton、specified。
九、自适应布局与响应式布局
| 类型 | 手段 |
|---|---|
| 自适应布局 | 拉伸、均分、占比、缩放、隐藏 |
| 响应式布局 | 断点、栅格、媒体查询、资源限定词 |
断点必背:sm 320–599 / md 600–839 / lg 840–1439 / xl ≥ 1440(vp);栅格默认 12 列;长度用 vp、字体用 fp。
一次开发多端部署是三层架构:UI 层 + 功能层 + 基础层,不是"一套布局到处拉伸"。
十、权限类型
| 类型 | 授予方式 | 示例 |
|---|---|---|
system_grant | 安装时自动授予,只需声明 | INTERNET、KEEP_BACKGROUND_RUNNING |
user_grant | 运行时动态申请 | CAMERA、MICROPHONE、LOCATION、相册、DISTRIBUTED_DATASYNC |
user_grant 三步:声明 → 填 reason / usedScene → requestPermissionsFromUser。光声明不会自动授权。
四条生命周期
自定义组件:
aboutToAppear → build → onDidBuild →(销毁)aboutToDisappear
复用场景:aboutToReuse / aboutToRecycle
页面(仅 @Entry):onPageShow / onPageHide / onBackPress。注意 onPageShow 每次显示都会触发,不是只跑一次;一个页面也只能有一个 @Entry。
UIAbility(顺序必背):
onCreate
→ onWindowStageCreate
→ onForeground
→ onBackground
→ onWindowStageDestroy
→ onDestroy
loadContent 写在 onWindowStageCreate,不是 onCreate——先有 Ability,再有窗口。
AVPlayer 状态机:
idle → initialized(设源)→ prepared(prepare)
→ playing ↔ paused → completed → stopped → released
用完必须 release()。
35 条高频易错判断
能一眼说出"为什么错",判断题就稳了。
| # | 说法 | 判断 | 理由 |
|---|---|---|---|
| 1 | ArkTS 支持 any 和 unknown | ✗ | 明确禁用,用联合类型/泛型/明确类型 |
| 2 | ArkTS 可以用 var 声明变量 | ✗ | 只能 let / const |
| 3 | ArkTS 支持结构化类型 | ✗ | 名义类型,要显式 implements/extends |
| 4 | ArkTS 可以运行时给对象加属性 | ✗ | 对象布局编译期固定 |
| 5 | ArkTS 支持 delete 和 in | ✗ | 都不支持 |
| 6 | ArkTS 支持 Function.apply/call/bind | ✗ | 均不支持 |
| 7 | @State 能观察对象的所有嵌套属性 | ✗ | V1 只观察第一层,深层用 @Observed/@ObjectLink 或 V2 |
| 8 | @Prop 是双向同步 | ✗ | 单向,父 → 子 |
| 9 | @Link 可以由子组件本地初始化 | ✗ | 必须由父组件用 $ 传入 |
| 10 | @Provide/@Consume 只能父子直传 | ✗ | 可跨层级 |
| 11 | @ObjectLink 必须由父组件传入 | ✓ | 不能在子组件本地初始化 |
| 12 | @StorageProp 是双向同步 | ✗ | 单向,@StorageLink 才双向 |
| 13 | @ComponentV2 可以使用 @State | ✗ | V1/V2 不混用 |
| 14 | @Param 在子组件中可以随意修改 | ✗ | 只读,通过 @Event 回调 |
| 15 | @Computed 每次访问都重新计算 | ✗ | 有缓存,依赖变化才重算 |
| 16 | @Entry 页面可以有多个 | ✗ | 一个页面只能有一个 |
| 17 | onPageShow 只执行一次 | ✗ | 每次显示都可能触发 |
| 18 | UIAbility 先 onCreate 后 onWindowStageCreate | ✓ | 先有 Ability,后有窗口 |
| 19 | loadContent 应放在 onCreate | ✗ | 应放在 onWindowStageCreate |
| 20 | 默认启动模式是 singleton | ✓ | 重复拉起复用实例,触发 onNewWant |
| 21 | HAP 可以依赖另一个 HAP | ✗ | HAP 之间不能互相依赖 |
| 22 | HAR 是运行时共享包 | ✗ | HAR 是编译时静态共享包 |
| 23 | HSP 可以独立安装运行 | ✗ | 跟随宿主应用发布 |
| 24 | HAR/HSP 支持依赖传递 | ✗ | 都不支持循环依赖和依赖传递 |
| 25 | TaskPool 自动管理线程 | ✓ | Worker 才需要手动管理 |
| 26 | @Concurrent 函数可以使用闭包变量 | ✗ | 只能用入参和 import 的常量/模块 |
| 27 | TaskPool 任务中可以直接更新 UI | ✗ | UI 只能在主线程更新 |
| 28 | Worker 最多创建 64 个(API 12+) | ✓ | 旧版本是 8 个 |
| 29 | 普通对象跨线程是共享引用 | ✗ | 默认序列化拷贝,@Sendable 才共享 |
| 30 | Preferences 支持分布式同步 | ✗ | 跨设备用 KV Store / 分布式数据对象 |
| 31 | RDB 支持 SQL 和事务 | ✓ | 基于 SQLite |
| 32 | 分布式软总线就是云同步 | ✗ | 主要是近场可信设备互联 |
| 33 | 一次开发多端部署就是一套布局到处拉伸 | ✗ | 三层架构 + 自适应 + 响应式 + 资源适配 |
| 34 | 卡片可以常驻后台执行长时任务 | ✗ | 卡片能力受限,不能常驻 |
| 35 | 长时任务不需要权限 | ✗ | 需要对应类型和 KEEP_BACKGROUND_RUNNING 等权限 |
数字速记
| 数字 | 含义 |
|---|---|
| 60 / 100 / 80 / 3 | 60 分钟、满分 100、80 及格、每月 3 次 |
| 64 / 8 | Worker 上限:API 12+ 是 64,旧版是 8 |
| 320 / 600 / 840 / 1440 | 断点边界(vp) |
| 12 | 栅格默认列数 |
| 3 | TaskPool 优先级 HIGH/MEDIUM/LOW |
| 1×2、2×2、2×4、4×4 | 常见卡片尺寸 |
自测 12 题(自编模拟,非官方真题)
下面这些是我按官方文档自己出的练习,不是考试原题,也不要拿去找"题源"——认证考试题目本身有保密要求,真正能帮到你的是把每个选项的对错理由说清楚。
判断
- ArkTS 里可以用
obj["propName"]在运行时动态读写普通对象的属性。 @Link修饰的变量可以在子组件里写默认值。- HAR 与 HSP 都不支持循环依赖。
- 声明了
user_grant权限后,安装时就会自动获得授权。
单选
- 需要在不相关的跨层级组件间共享并可双向修改状态,应选:
A.@PropB.@Provide+@ConsumeC.@StateD.@Watch - 要把一段耗时的数组计算放到后台且不常驻,最合适的是:
A. Worker B. TaskPool C. 主线程setTimeoutD. 卡片 loadContent()应该写在:
A.onCreateB.onWindowStageCreateC.onForegroundD.aboutToAppear- 上架应用市场提交的包格式是:
A..hapB..harC..appD..zip
多选
- 关于
@Concurrent修饰的函数,正确的有:
A. 不能使用闭包变量 B. 不能使用thisC. 可以直接更新 UI D. 参数与返回值需可序列化 - 跨设备数据同步可以用下面哪些方案?
A. Preferences B. KV Store C. 分布式数据对象 D. RDB - 属于响应式布局手段的有:
A. 断点 B. 栅格 C. 拉伸 D. 媒体查询 - Stage 模型里 UIAbility 的启动模式包括:
A. singleton B. multiton C. specified D. shared
参考答案与理由
- ✗ ArkTS 禁止运行时动态索引普通对象,要映射就用
Map。 - ✗
@Link必须由父组件用$传引用,子组件不能本地初始化。 - ✓ HAR、HSP 都不支持循环依赖,也不支持依赖传递。
- ✗
user_grant必须运行时requestPermissionsFromUser动态申请。 - B
@Provide/@Consume可跨层级且双向。 - B 短时独立任务用 TaskPool,常驻或频繁通信才 Worker。
- B 先有 Ability 再有窗口,
loadContent在onWindowStageCreate。 - C
.app上架,.hap安装运行。 - ABD 并发任务里绝对不能碰 UI。
- BC Preferences 与 RDB 不具备分布式同步能力。
- ABD 拉伸属于自适应布局,不是响应式布局。
- ABC 默认 singleton。
考场策略
- 60 分钟做 50–60 题,平均一分钟一题,给多选题留 20 分钟。
- 先易后难,不会的先标记,交卷前一定回看。
- 多选题宁缺毋滥,只选有把握的;错选整题没分。
- 看到"所有、任意、无需、直接、完全、一定"这类绝对化表述,先怀疑。
- 看到"推荐":路由选 Navigation,应用模型选 Stage,短任务选 TaskPool、长任务选 Worker。
- 看到"跨层级"想 Provide/Consume,看到"嵌套对象"想 Observed/ObjectLink。
- 不要空题,判断题闭眼选也比留空强。
参考
更多推荐




所有评论(0)