诗词播放-暂停-高亮的方案
鸿蒙中地图功能如何实现,申请流程是什么样的
-
主要通过 集成 Map Kit 的功能来实现
-
Map Kit 功能很强大,比如有
-
在编码之前需要
- 完成证书的申请和公钥指纹的一些配置
- 还要在AGC平台上开通地图服务应用
- 代码中使用 项目的 client_id
- 最后开始编码
一多开发是如何实现的
-
一多开发是一次开发多端部署
-
主要分成三个核心部分
- 工程级一多
- 界面级一多
- 能力级一多
-
工程级一多主要指的是使用华为鸿蒙推荐的三层架构来搭建项目,比如
- 第一层,最底层是 common-公共能力层,用于存放公共基础能力集合(如工具库、公共配置等),一般是使用HSP包(动态共享包),这样它被项目中多个模块引入的话,也只会保留一个备份。
- 第二层,是features-基础特性层,用于存放基础特性集合(如应用中相对独立的各个功能的UI及业务逻辑实现等)
- 顶层是,products-产品定制层,用于针对不同设备形态进行功能和特性集成
-
界面级一多指的是一套代码可以适配不同尺寸、形态的设备,主要通过以下这些技术来实现
- 自适应布局 等比拉伸缩放等等相关技术
- 响应式布局 通过断点、媒体查询、栅格布局来实现
-
能力级一多主要指的是不同硬件设备支持能力不一样,如蓝牙、摄像头、传感器等等。这些主要通过判断当前设置是否支持该能力来决定是否调用相关的api功能。如利用编辑器工具的智能提示、和代码中使用的caniuse或者try-catch进行判断使用。
三层架构
- 第一层,最底层是 common-公共能力层,用于存放公共基础能力集合(如工具库、公共配置等),一般是使用HSP包(动态共享包),这样它被项目中多个模块引入的话,也只会保留一个备份。
- 第二层,是features-基础特性层,用于存放基础特性集合(如应用中相对独立的各个功能的UI及业务逻辑实现等)
- 顶层是,products-产品定制层,用于针对不同设备形态进行功能和特性集成
录音有做过吗?avrecoder有几种状态?
录音可以通过AVRecorder和AudioCapturer来实现。两者区别主要在支持录制声音的格式不同和控制录音文件的细小粒度不同上。AVRecorder会简单一些,AudioCapturer会复杂一些-还可以搭配ai语音功能使用
AVRecorder主要有以下这些状态:
类型 | 说明 |
---|---|
'idle' | 闲置状态。 |
'prepared' | 参数设置完成 |
'started' | 正在录制。 |
'paused' | 录制暂停。 |
'stopped' | 录制停止。 |
'released' | 录制资源释放。 |
'error' | 错误状态。 |
图片上传有做过吗?图片处理,旋转、缩放、图片保存有做过吗?
做过相册图片的上传(如果是沙箱内的图片只需要1个步骤即可,直接上传),流程主要有3个步骤,基于photoAccessHelper 、CoreFileKit、NetworkKit来实现的
- photoAccessHelper 用来实现选择要上传的相册的图片
- CoreFileKit 将相册图片拷贝到沙箱目录
- NetworkKit 负责将沙箱目录内的图片上传到服务器上
图片处理,旋转、缩放、图片保存主要基于Image Kit来实现。它提供有
- 图片解码
- 指将所支持格式的存档图片解码成统一的PixelMap,以便在应用或系统中进行图片显示或图片处理。
- PixelMap
- 指图片解码后无压缩的位图,用于图片显示或图片处理。
- 图片处理
- 指对PixelMap进行相关的操作,如旋转、缩放、设置透明度、获取图片信息、读写像素数据等。
- 图片编码
- 指将PixelMap编码成不同格式的存档图片,用于后续处理,如保存、传输等。
其中压缩图片是通过 一个ImageKit的packing函数,传入压缩比例(0-100)来是实现的。值越小体积越小
视频有做过吗?
- 如果是普通的视频播放直接使用 Video组件来播放即可。功能相对弱一些
- 如果是对视频播放进行神帝的一些处理,如流媒体、本地资源解析、媒体资源解封装、视频解码和自定义渲染的这些功能,可以使用AVPlayer来实现。
- 如果类似做一个编辑视频的软件,那么就需要使用到对应的CAPI接口来实现了(调用底层c++的能力)
同事发给你代码,你怎么知道它的bundlename
一般直接看AppScope中的字段就行
鸿蒙如何和网页端通信?
- 如果是应用的话,使用web组件和对应的controller的一些接口,如 runJavaScript()和registerJavaScriptProxy
- 如果是元服务的话,使用AtomicServiceWeb来实现,因为2025年1月22日后不支持使用web。还有AtomicServiceWeb没有了web中的如 runJavaScript()和registerJavaScriptProxy接口,但是它一样可以通过页面的url进行参数的传递和鸿蒙端提供了js sdk,也可以很方便的让h5端调用鸿蒙端的功能
跨域是怎么处理的?
跨域存在于不同源的浏览器和服务器的网络通信中,因为鸿蒙端嵌套了web组件,理解成就是一个浏览器,因此也会存在跨域
为了提高安全性,ArkWeb内核不允许file协议或者resource协议访问URL上下文中来自跨域的请求。因此,在使用Web组件加载本地离线
资源的时候,Web组件会拦截file协议和resource协议的跨域访问。
主要有两种解决方案
- 将本地资源替换成网络资源,也就是file协议访问的是本地的资源,我们将本地资源放在网络上,通过http请求的方式来加载,然后在后端设置cors跨域即可。同时,开发者需利用Web组件的onInterceptRequest方法,对本地资源进行拦截和相应的替换
- 通过setPathAllowingUniversalAccess 白名单设置一个路径列表。当使用file协议访问该列表中的资源时,允许进行跨域访问本地文件
录音过程中息屏怎么处理?
可以通过申请长时任务,实现在后台长时间运行。长时任务支持的类型,包含数据传输、音视频播放、录制、定位导航、蓝牙相关、多设备互联、WLAN相关、音视频通话和计算任务
开发步骤如下:
- 需要申请ohos.permission.KEEP_BACKGROUND_RUNNING权限
- 声明后台模式类型(录音等)
- 通过 @ohos.resourceschedule.backgroundTaskManager和@ohos.app.ability.wantAgent 进行编码处理
有做过华为支付吗?
需要企业资质、需要在AGC平台上开通服务。
- 商户客户端请求商户服务器创建商品订单。
- 商户服务器按照商户模型调用Payment Kit服务端直连商户预下单或平台类商户/服务商预下单接口。
- 华为支付服务端返回预支付ID(prepayId)。
- 商户服务端组建订单信息参数orderStr返回给商户客户端。
- 商户客户端调用requestPayment接口调起Payment Kit支付收银台。
- Payment Kit客户端展示收银台。
- 用户通过收银台完成支付,Payment Kit客户端会收到支付结果信息并请求Payment Kit服务端处理支付。
- Payment Kit服务端成功受理支付订单并异步处理支付。
- Payment Kit服务端将支付结果返回给Payment Kit客户端。
- Payment Kit客户端展示支付结果页。
- 用户关闭支付结果页后Payment Kit客户端会返回支付状态给商户客户端。
- 支付处理完成后,Payment Kit服务端会调用回调接口返回支付结果信息给商户服务端。
- 商户服务端收到支付结果回调响应后,使用SM2验签方式对支付结果进行验签。
说一下多线程
HarmonyOS中的生命周期
页面生命周期
- onpageshow:页面每次显示时触发,包括路由过程、应用进入前台等场景。例如,用户从后台切换应用到前台,或者通过路由跳转到该页面时,此方法会被调用
- onpagehide:页面每次隐藏时触发,包括路由过程、应用进入后台等场景。比如用户按下主页键将应用切换到后台,或者通过路由跳转到其他页面时,该页面的 onpagehide 方法会被执行
- onbackpress:当用户点击返回按钮时触发。如果返回值为 true,表示页面自己处理返回逻辑,不进行页面路由;返回 false 则表示使用默认的路由返回逻辑,不设置返回值时按照 false 处理
组件生命周期
- abouttoappear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其 build () 函数之前执行。在该函数中可以修改变量,更改将在后续执行 build () 函数中生效
- abouttodisappear:在自定义组件析构销毁之前执行。在此函数中不允许改变状态变量,特别是 @link 变量的修改可能会导致应用程序行为不稳定
UIAbility 生命周期
- create 状态:在应用加载过程中,UIAbility 实例创建完成时触发,系统会调用 oncreate () 回调。可以在该回调中进行页面初始化操作,例如变量定义、资源加载等,用于后续的 UI 展示
- windowstagecreate 状态:UIAbility 实例创建完成之后,在进入 foreground 之前,系统会创建一个 windowstage。windowstage 创建完成后会进入 onwindowstagecreate () 回调,可以在该回调中设置 UI 加载、设置 windowstage 的事件订阅,如获焦 / 失焦、可见 / 不可见等事件
- foreground 状态:当 UIAbility 实例切换至前台时触发,对应于 onforeground () 回调。在 onforeground () 中可以申请系统需要的资源,或者重新申请在 onbackground 中释放的资源.
- background 状态:当 UIAbility 实例切换至后台时触发,对应于 onbackground () 回调。在该回调中可以释放 UI 界面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等.
- windowstagedestroy 状态:在 UIAbility 实例销毁之前,会先进入 onwindowstagedestroy 回调,可以在该回调中释放 UI 界面资源
- destroy 状态:在 UIAbility 实例销毁时触发,可以在 ondestroy () 回调中进行系统资源的释放、数据的保存等操作
用Entry和Navigation装饰的页面有哪些区别
- @Entry装饰的页面是应用的入口页面,通常用于展示应用的初始界面,而Navigation组件是一个导航容器,挂载在单个页面下,支持跨模块的动态路由。
- @Entry页面具有通用的生命周期方法,而Navigation组件里的页面不执行onPageShow、onPageHide等生命周期回调。
HarmonyOS中里面有几种包,分别有什么作用
HarmonyOS中有三种类型的包:HAP(HarmonyOS Ability Package)、HAR(Harmony Archive)、HSP(Harmony Shared Package)。
- HAP是应用安装和运行的基本单元,分为entry和feature两种类型。
- HAR是静态共享包,用于代码和资源的共享。
- HSP是动态共享包,用于应用内共享代码和资源。
简单介绍一下Stage模型
- Stage模型是HarmonyOS应用开发的基础架构,它提供了面向对象的开发方式,规范化了进程创建的方式,并提供组件化开发机制。
- Stage模型的组件天生具备分布式迁移和协同的能力,支持多设备形态和多窗口形态,重新定义了应用能力边界。
HarmonyOS中的动画
HarmonyOS提供了多种动画能力,包括属性动画、显式动画、转场动画、路径动画和粒子动画。
如何进行路由页面传参
在HarmonyOS中,可以通过router.pushUrl方法跳转到目标页面,并携带参数。在进入被分享页面时,通过router.getParams()来获取
传递的数据。此外,还可以使用LocalStorage等在页面间共享状态。
ArkTS和TS的区别有哪些区别
ArkTS是HarmonyOS优选的主力应用开发语言,它保持了TypeScript的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。ArkTS与TS的主要区别在于ArkTS是静态类型的,而TS支持动态类型。ArkTS在编译时进行类型检查,有助于在代码运行前发现和修复错误。
常见装饰器
-
@State:@State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。
-
@Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量是可变的,但修改不会同步回父组件。深拷贝。
-
@Link:@Link装饰的变量可以和父组件建立双向同步关系,子组件中@Link装饰变量的修改会同步给父组件中建立双向数据绑定的数据源,父组件的更新也会同步给@Link装饰的变量。
-
@Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过alias(别名)或者属性名绑定。
-
@Observed:@Observed装饰class,需要观察多层嵌套场景的class需要被@Observed装饰。单独使用@Observed没有任何作用,需要和@ObjectLink、@Prop联用。
-
@ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。
-
AppStorage是应用程序中的一个特殊的单例LocalStorage对象,是应用级的数据库,和进程绑定,通过@StorageProp和@StorageLink装饰器可以和组件联动。
-
AppStorage是应用状态的"中枢",将需要与组件(UI)交互的数据存入AppStorage,比如持久化数据PersistentStorage和环境变量Environment。UI再通过AppStorage提供的装饰器或者API接口,访问这些数据。
-
框架还提供了LocalStorage,AppStorage是LocalStorage特殊的单例。LocalStorage是应用程序声明的应用状态的内存"数据库",通常用于页面级的状态共享,通过@LocalStorageProp和@LocalStorageLink装饰器可以和UI联动。
鸿蒙的 router 和 Navigation 的对比
- router最多页面栈为32个,Navigation 无限制
- Navigation 支持一多开发,Auto模式自适应单栏跟双栏显示
- Navigation 支持获取指定页面参数
- Navigation 清理指定路由
- Navigation 支持路由拦截
能力对比
业务场景 | 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') |
获取页面栈对象 | 支持 | 不支持 |
路由拦截 | 支持通过setInercption做路由拦截 | 不支持 |
路由栈信息查询 | 支持 | getState() & getLength() |
路由栈move操作 | moveToTop & moveIndexToTop | 不支持 |
沉浸式页面 | 支持 | 不支持,需通过window配置 |
设置页面标题栏(titlebar)和工具栏(toolbar) | 支持 | 不支持 |
模态嵌套路由 | 支持 | 不支持 |