2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)
前端卷的不行,岗位也少,花了一个星期把HarmonyOS应用开发者基础认证和HarmonyOS应用开发者高级认证拿下了,除了概念性内容不要硬背,理解为主。有需要题库的可以点这,是9月份最新搜集的题目,共计188题,均分85,没信心考过的可以私信联系博主,这个高级认证很重要但有点难考,尤其是6月23日更新之后的题目,取消了10道判断题且增加10道题,改为40道单选(40分)+20道多选(60分),很多公司都是要6.23之后的高级认证,初级认证可以不考但高级认证是鸿蒙开发岗位的入场券,没有这个证就相当于没有从业资格,除非你是本就是安卓或者ios开发
现在的官网文档和特性更新很快很频繁,所以指不定啥时候就增加/删除一些东西了,有错误很正常,提醒我修改下。
鸿蒙岗位稀缺且不稳定,博主已转行,故不再维护此文档
1. HarmonyOS应用打包后的文件扩展名是?
打包后的文件扩展名为.hap(HarmonyOS Ability Package),这是HarmonyOS应用的标准包格式
2. 页面和自定义组件生命周期有哪些?
页面和自定义组件生命周期说明
有@Entry装饰器的@component组件的生命周期
- onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
- onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
- onBackPress:当用户点击返回按钮时触发。
有@Entry装饰器和无@Entry装饰器@Component组件都有的生命周期
- aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其
build()
函数之前执行。 - onDidBuild:API12新增,组件
build()
函数执行完成之后回调该接口,不建议在onDidBuild
函数中更改状态变量、使用animateTo
等功能,这会导致不稳定的UI表现。 - aboutToDisappear:
aboutToDisappear
函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改会导致应用程序行为不稳定。
3. 如何进行数据持久化?
应用数据持久化
- 用户首选项(Preferences):这是一种轻量级的配置数据持久化方式,适用于保存应用配置信息、用户偏好设置等。它通过文本形式保存数据,并且数据会全量加载到内存中,因此访问速度快,但不适合存储大量数据。
- 键值型数据库(KV-Store):适用于存储结构简单的数据,如商品名称和价格、员工工号和出勤状态等。键值型数据库以“键值对”的形式组织数据,适合数据关系不复杂的场景。
- 关系型数据库(RelationalStore):基于SQLite,适用于存储包含复杂关系的数据,如学生信息、雇员信息等。关系型数据库提供了一系列SQL操作,如增删改查等。
4. 如何进行全局状态管理?
应用全局的UI状态存储
- @Provide+@Consume装饰器
适用场景:适用于整个组件树而言“全局”的状态共享,且该状态改动不频繁的场景。
工作原理:通过在最顶层组件中使用@Provide
装饰器提供状态,其他需要共享状态的组件通过@Consume
装饰器获取该状态 。
优点:减少了状态传递的层级,提升了代码的可维护性和可拓展性。
注意事项:确保状态的生命周期与组件树的生命周期一致,避免不必要的UI刷新。 - AppStorage
适用场景:适用于整个应用而言“全局”的变量或应用的主线程内多个UIAbility
实例间的状态共享。
工作原理:AppStorage
与应用的进程绑定,由UI框架在应用程序启动时创建,当应用进程终止,AppStorage
被回收。
优点:适用于需要在整个应用中共享状态的场景。
注意事项:确保状态的生命周期与应用进程一致,避免在应用退出后仍有状态存在。 - LocalStorage
适用场景:适用于单个Ability而言“全局”的变量,主要用于不同页面间的状态共享。
工作原理:LocalStorage
的生命周期由应用程序决定,当应用释放最后一个指向LocalStorage
的引用时,LocalStorage
被垃圾回收。
优点:适用于需要在单个UIAbility中不同页面间共享状态的场景。
注意事项:确保状态的生命周期与应用程序的生命周期一致,避免在应用退出后仍有状态存在。
5. LocalStorage在应用重启后数据会消失吗?
页面级UI状态存储
会,因为LocalStorage 是一种用于页面或组件级别的数据存储方式,它允许开发者在页面或组件的生命周期内存储和检索数据。LocalStorage 的数据存储在内存中,因此它的读写速度相对较快。但是,当应用重启后,LocalStorage 中的数据会丢失。
6. 父子组件如何通信?
@Prop装饰器、@Link装饰器、@Provide和@Consume装饰器、@Event装饰器、@Parame装饰器、@Provider装饰器和@Consumer装饰器
当前(API 12)状态管理有两个版本 @Component
和 @ComponentV2
- 父子单向数据传递
@State
+@Prop
@Prop
装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。 - 父子双向数据传递
@State
+@Link
、@objectLink
+@Link
子组件中被@Link
装饰的变量与其父组件中对应的数据源建立双向数据绑定。 - 跨组件通信
@Provide
装饰器和@Consume
装饰器
@Provide
和@Consume
,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于@Prop
和@Link
,@Provide
和@Consume
摆脱参数传递机制的束缚,实现跨层级传递。 @Observed
装饰器和@ObjectLink
装饰器
对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就要用到@Observed
/@ObjectLink
装饰器
注意:@ObjectLink
装饰器不能在@Entry
装饰的自定义组件中使用且@ObjectLink
装饰的变量不能被赋值,只能对其属性进行赋值操作
7. 兄弟组件如何通信?
-
通过公共父组件传递
如果两个组件是同一个父组件的子组件,可以通过父组件来传递数据或事件。父组件可以作为中介,将一个子组件的数据或事件传递给另一个子组件。 -
使用全局状态管理
使用全局状态管理(如 AppStorage、LocalStorage)来存储共享数据。兄弟组件可以独立地读取和更新这个全局状态,从而实现通信。
8. 如何实现页面间的通信?
- 使用
@Provide
和@Consume
装饰器(见6.3) - 使用路由跳转传参
import {
router } from '@kit.ArkUI';
router.pushUrl({
url: 'pages/Detail', // 目标url
params: paramsInfo // 添加params属性,传递自定义参数
})
// 返回指定页面并携带参数
router.back({
url: 'pages/Home',
params: {
info: '来自Home页'
}
});
- 使用导航跳转传参
this.pageStack.pushPath({
name: "PageOne", param: "PageOne Param" })
this.pageStack.pushPathByName("PageOne", "PageOne Param")
9. Navigation组件跳转和router跳转有什么区别?
官方文档写了很多,捡几个我觉得比较重要的写的
-
Navigation
:是路由容器组件,适用于模块内和跨模块的路由切换,一次开发,多端部署场景。Router
位于页面栈管理节点stage
下面,不提供导航容器的概念。
-
Navigation
和Router
都支持跳转传参,但Router
对象中暂不支持方法变量。
-
Navigation
:支持清理指定路由,页面栈没有上限,可以无限跳转。Router
不支持清理指定路由且页面栈最大为32,页面栈到达32之后必须清除之后才能继续跳转。
-
Navigation
:支持自定义转场动画和共享元素转场动画。Router
:仅支持简单自定义转场动画。
-
Navigation
:支持通过setInterception
方法设置路由拦截。Router
:不支持路由拦截。
-
Navigation
:支持沉浸式页面和模态嵌套路由。Router
:不支持,需要通过窗口配置实现沉浸式页面。
总而言之,Navigation
组件在功能上更具丰富性和灵活性,特别是在处理复杂的导航结构、动效和路由管理方面。
而 Router
则提供了更基础的路由跳转功能,适合简单的路由需求。开发者可以根据应用的具体需求和设计选择最合适的路由方案。
具体的区别如下表:
业务场景 | Navigation | Router |
---|---|---|
一多能力 | 支持,Auto模式自适应单栏跟双栏显示 | 不支持 |
跳转指定页面 | pushPath & pushDestination | pushUrl & pushNameRoute |
跳转HSP中页面 | 支持 | 支持 |
跳转HAR中页面 | 支持 | 支持 |
跳转传参 | 支持 | 支持 |
获取指定页面参数 | 支持 | 不支持 |
传参类型 | 传参为对象形式 | 传参为对象形式,对象中暂不支持方法变量 |
跳转结果回调 | 支持 | 支持 |
跳转单例页面 | 支持 | 支持 |
页面返回 | 支持 | 支持 |
页面返回传参 | 支持 | 支持 |
返回指定路由 | 支持 | 支持 |
页面返回弹窗 | 支持,通过路由拦截实现 | showAlertBeforeBackPage |
路由替换 | replacePath & replacePathByName | replaceUrl & replaceNameRoute |
路由栈清理 | clear | clear |
清理指定路由 | removeByIndexes & removeByName | 不支持 |
转场动画 | 支持 | 支持 |
自定义转场动画 | 支持 | 支持,动画类型受限 |
屏蔽转场动画 | 支持全局和单次 | 支持 设置pageTransition方法duration为0 |
geometryTransition共享元素动画 | 支持(NavDestination之间共享) | 不支持 |
页面生命周期监听 | UIObserver.on(‘navDestinationUpdate’) | UIObserver.on(‘routerPageUpdate’) |
获取页面栈对象 | 支持 | 不支持 |
路由拦截 | 支持通过setInterception做路由拦截 | 不支持 |
路由栈信息查询 | 支持 | getState() & getLength() |
路由栈move操作 | moveToTop & moveIndexToTop | 不支持 |
沉浸式页面 | 支持 | 不支持,需通过window配置 |
设置页面标题栏(titlebar)和工具栏(toolbar) | 支持 | 不支持 |
模态嵌套路由 | 支持 | 不支持 |
10. HarmonyOS与Android和iOS有什么区别?
HarmonyOS 是华为开发的一个开源、分布式的操作系统。它设计用于多种设备,包括智能手机、平板电脑、智能电视和物联网设备。与Android和iOS的主要区别在于:
- 分布式架构:HarmonyOS支持跨设备无缝协作,允许设备之间共享硬件资源。
- 性能:HarmonyOS优化了任务调度和内存管理,提高了性能和响应速度。
- 安全性:HarmonyOS采用了多层次的安全策略,包括数据加密和安全启动。
- 生态系统:HarmonyOS正在构建自己的应用生态系统,鼓励开发者使用Ark Ts和ArkUI框架。
11. 什么是Ability?
Ability
是应用/服务所具备的能力的抽象,一个Module可以包含一个或多个 Ability
,在鸿蒙系统中,Ability
提供了对 Ability
生命周期、上下文环境等调用管理的能力,包括 Ability
创建、销毁、转储客户端信息等
鸿蒙系统中的 Ability
主要分为两种类型:UIAbility
和 ExtensionAbility
。
- UIAbility :
- 定义 :包含UI界面,提供展示UI的能力,主要用于和用户交互 。
- 创建 :在模块中添加UIAbility时,选中对应的模块,单击鼠标右键,选择New > Ability,设置Ability名称,选择是否在设备主屏幕上显示该功能的启动图标,单击Finish完成Ability创建 。
- ExtensionAbility :
- 定义 :提供特定场景的扩展能力,满足更多的使用场景 。
- 创建 :在模块中添加ExtensionAbility时,选中对应的模块,单击鼠标右键,选择不同的场景类型(如Accessibility、EmbeddedUIExtensionAbility等) 。当前仅Application工程支持创建ExtensionAbility。设置Ability名称,单击Finish完成ExtensionAbility创建。
此外,Ability是Ability模块的基类,提供系统配置更新回调和系统内存调整回调 。Ability的继承关系包括UIAbility和ExtensionAbility等具体类.
总之,Ability是鸿蒙系统中用于管理应用能力的核心组件,通过不同类型的Ability可以实现不同的功能需求。
12. ArkUI框架有哪些特点?
ArkUI框架是鸿蒙(HarmonyOS)中的一个重要组件框架,具有以下几个特点:
- 组件树结构 : ArkUI框架通过布局组件和基础组件构建界面描述树(组件树),其中基础组件为叶子节点,布局组件为中间节点 。当用户进行交互时,会触发界面修改,通过重新渲染组件树来实现应用界面更新 。
- 数据与UI更新过程 : ArkUI框架的数据处理过程和UI更新过程是分开进行的。数据处理过程中,主要是对状态数据进行更新,并通过标脏过程确定布局最小影响范围,减少不必要的重新布局 。UI更新过程包括组件标脏、布局、测量和渲染等阶段 。
- 布局组件 : ArkUI框架提供了多种布局组件,如Row、Column、Stack、Flex、List、Grid、RelativeContainer等。开发者可以根据场景选择合适的布局组件,以优化性能 。例如,线性布局(Row、Column)适用于横向或纵向排列组件,而弹性布局(Flex)适用于需要弹性排列的场景。
- 性能优化 : ArkUI框架在性能优化方面做了很多工作。例如,通过减少不必要的组件嵌套和节点数量,降低布局测算的复杂度,从而提升性能。开发者可以使用DevEco Studio提供的工具(如Profiler和ArkUI Inspector)来查看性能瓶颈和组件树结构,进一步优化应用性能。
- 状态管理 : ArkUI框架支持状态管理最佳实践,通过有效的状态管理减少无效的UI更新操作,提升性能。例如,在状态变量变化导致UI更新时,只更新部分组件,而不是重新渲染整个界面。
13. 跨设备通信的方式有哪些?
HarmonyOS支持多种跨设备通信方式,包括:
- 分布式软总线:一种高性能的通信机制,允许设备之间建立直接连接,进行数据传输。
- 蓝牙:使用标准的蓝牙技术进行设备间的通信。
- WLAN:通过WLAN网络实现设备间的通信。
- 远程服务调用:通过分布式任务调度实现跨设备的服务调用。
14. 如何实现应用的后台运行?
- 后台服务:使用后台服务(如BackgroundService)来执行不需要用户直接交互的任务。
- 定时任务:通过系统提供的定时任务机制(如AlarmService)来周期性执行后台任务。
- 事件监听:注册系统事件,如网络变化、电量变化等,以在特定事件发生时唤醒应用进行处理。
15. Ability是如何与用户交互的?
- 界面显示:Ability可以包含一个或多个AbilitySlice,用于显示UI界面并与用户进行交互。
- 事件处理:Ability可以处理用户的输入事件,如触摸、按键等。
- 数据绑定:Ability可以使用数据绑定机制,将UI组件与数据模型绑定,实现数据的自动更新和交互。
- 通知:Ability可以通过系统通知机制向用户发送通知,即使应用不在前台运行。
16. 如何实现应用的多语言支持?
- 资源文件:为每种语言创建资源文件(如string.json),并在里面定义所有可本地化的字符串。
- 资源引用:在代码中使用资源ID引用字符串,而不是硬编码文本。
- 系统设置:应用会自动根据系统设置的语言环境加载相应的资源文件。
- 动态切换:支持在应用运行时切换语言,并动态更新UI。
17. 分布式数据库是如何实现数据同步的?
- 分布式事务:确保跨设备的数据库操作具有原子性、一致性、隔离性和持久性。
- 数据版本控制:为数据添加版本号,确保同步时数据的一致性。
- 冲突解决策略:定义冲突解决策略,处理并发操作导致的数据冲突。
- 网络状态感知:根据网络状态智能同步数据,优化同步效率和流量使用。
18. 如何优化应用的性能?
- 内存管理:合理分配和释放内存,