在这个手机端需求萎靡,新能源汽车不断增多的年代,鸿蒙作为车机系统,手机系统互联互通的开发语言,有着广阔的前景,目前就市面上大部分的鸿蒙面试题进行一个收集整理,后续会持续更新。。
1.页面和组件的生命周期
- 页面生命周期:
被@Entry装饰的组件生命周期,提供以下生命周期接口:
onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景
onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
onBackPress:当用户点击返回按钮时触发。 - 组件生命周期:
一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:
aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build0函数之前执行
onDidBuild:组件build(函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的U表现。
aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
具体的执行先后顺序为:aboutToAppear->build>onDidBuild->onPageShow->Component is visible->onPageHide->aboutToDisappear
2.应用上传下载功能
需要import系统库:
import request from '@ohos.request'
需要权限:ohos.permission.INTERNET
- request.downloadFile:
下载,异步方法,使用callback形式返回结果。通过on('complete'|'pause'|'remove')7+可获取任务下载时的状态信息,包括任务完成、暂停或移除。通过on('fail')7+可获取任务下载时的错误信息。 - request.uploadFile:
上传,异步方法,使用promise形式返回结果。通过on('complete'|'fail')9+可获取任务上传时的错误信息。
3.线程通信
HarmonyOS提供了两种线程间通信的方式,分别是Emitter和Worker
Emitter:Emitter主要适用于线程间的事件同步。它可以在不同的线程之间传递事件,并确保事件的顺序和同步性。通过Emiter,一个线程可以触发一个事件,然后其他线程可以监听并处理这个事件。这有助于不同线程之间的数据共享和协调。。
- emitter.on 持续订阅指定事件,并在接收到该事件时,执行对应的回调处理函数。
- emitter.once 单次订阅指定的事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。
- emitter.off 取消订阅指定事件。
Worker:Worker主要用于新开一个线程执行耗时任务。当需要执行一些耗时操作时,为了不阻塞主任务的执行,可以使用Worker线程。Worker线程是在主线程的上下文中创建的独立线程,它可以执行一些耗时任务,如网络访问、文件读写等。工作线程可以与主线程并行执行,以提高应用的响应性和性能。
- 使用Worker,需先构造ThreadWorker实例,ThreadWorker类继承WorkerEventTarget
4.HAP,HAR,HSP分别是什么
-
HAP:HAP (Harmony Abilty Package)是应用安装和运行的基本单元。其主要分为两种类型:entry和feature。
1.entry:应用的主模块,作为应用的入口,提供了应用的基础功能。
2.feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。 - HAR:HAR (HammonyArchive)是静态共享包。一般用作二方库,发布到OHPM私有仓库,供公司内部使用。或者发布到OHPM中心仓库,供其他应用使用
- HSP:HSP(Hamony Shared Package)是动态共享包。HSP往往是和 HAR做为对比区分了解。项目中,如果其他模块引入了 HAR,那么其他模块中都会存在 一份HAR的拷贝,此时会存在资源冗余。而HSP则是通过多个模块共享一个引用,资源空间得到利用。
5.本地缓存,数据持久化
- Preferences:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。
- AppStorage + PersistentStorage(应用全局的 UI 状态存储)
- KVStore(键值型数据库)
- RdbStore(关系型数据库)
- fs(写文件)
6.UIAbility唤起另外的应用程序
系统库app.ability.Want:Want是对象间信息传递的载体, 可以用于应用组件间的信息传递。 Want的使用场景之一是作为startAbility的参数, 其包含了指定的启动目标, 以及启动时需携带的相关数据, 如bundleName和abilityName字段分别指明目标Ability所在应用Bundle名称以及对应包内的Ability名称。当Ability A需要启动Ability B并传入一些数据时, 可使用Want作为载体将这些数据传递给Ability B。
使用逻辑:want系统将调用方传入的want参数(包含action、entities、uri和type属性)与已安装待匹配的应用Ability的skils配置(包含actions、entities、uris和type属性)依次进行匹配。当四个属性匹配均通过,则此应用才会被应用选择器展示给用户进行选择。
7.开发中常用的关键字
- @State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型和本地初始化
- @Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。
- @Link子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。
- @Provide装饰器和@Consume装饰器:与后代组件双向同步,应用于状态数据在多个层级之间传递的场景
- @Builder装饰器:自定义构建函数。该自定义组件内部UI结构固定,仅与使用方进行数据传递,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。
- @Local装饰器:@Local表示组件内部的状态,使得自定义组件内部的变量具有观测变化的能力,被@Local装饰的变量无法从外部初始化,因此必须在组件内部进行初始化。