HarmonyOS与Android和iOS有什么区别
HarmonyOS是华为的开源、分布式的操作系统。支持跨设备协作,允许设备之间共享硬件资源。优化了任务调度和内存管理,提高了性能和响应速度。采用了多层次的安全策略,包括数据加密和安全启动。鼓励开发者使用ArkTs和ArkUI框架。
HarmonyOS应用打包后的文件扩展名是?
打包后的文件扩展名为.hap。
hap、har、hsp三者的区别
hap 这种模块可以代表一个独立的项目。这个模块打包后的后缀名为hap。可以独立运行到设备,也可以独立上架到应用市场,分为两种类型feature、entry,可以有多个feature、entry只能有一个。
hsp:type为shared,动态共享包,打包后的后缀为hsp。无法独立编译和运行。必须依赖于entry和feature模块来运行。任何一个模块都可以引入hsp的内容,进行代码共享,一般在项目中,只会创建一个shared模块,名字为common。放置工具包、公共组件。
har:适用于存放项目中指定某些业务,从主模块中独立出来。比如电商项目中:可以把支付模块,购物车模块、商品列表独立为har、在页面中引入使用 static library模块。har 模块和hsp 模块的最大的区别是,hsp在引入到主模块后只会有一份引用,har引入到主模块打包后会拷贝多份。
三层架构
官方推荐common、features、product 三层架构,
common 存放hsp 动态共享包,包含(工具包、公共组件)
features:用来存放har 静态资源包,从模块抽离出来的业务模块。
product:用来存放 hap 类型的 ability 模块,这是我们项目的主要模块,一个模块下可以声明多个ability,ability 对着我们的窗口,一个ability下可以有多个页面。
三层架构,我们可以理解为小程序的分包的结构,product 就是我们项目的主体部分,entry 类型的 Ability模块对应我们主包,feature 类型的Ability 模块对应我们的分包,小程序分包是为了解决项目的体积的问题,鸿蒙的多模块开发是为了解决一多开发,一次开发,多端部署。
ArkTS是什么
ArkTS是HarmonyOS主力应用开发语言。保持了TypeScript的基本风格。
ArkTS的主要特点包括:
- 静态类型检查:在编译时进行类型检查,有助于在代码运行前发现错误,提高代码的稳定性。
- 声明式UI:使用更简单、更自然的方式开发跨端应用。
- 状态管理:可以在不同组件层级间传递,支持单向和双向数据流。
- 渲染控制:支持条件渲染、循环渲染和数据懒加载,根据不同状态渲染UI内容。
- 兼容性:兼容TS/JS生态,开发者可以使用TS/JS进行开发或复用已有代码。
- 并发机制:轻量化的并发机制,提高应用的性能和响应速度。
UIAbility的生命周期有哪些
UIAbility的生命周期包括Create、Forground、Background、Destroy四个状态
什么是Ability
一个鸿蒙应用可以声明多个模块,一个模块可以声明多个Ability,Ability是应用的窗口,Ability提供了对Ability生命周期、上下文环境等调用管理的能力,包括Ability创建、销毁、存储客户端信息。
鸿蒙系统中的 Ability主要分为两种类型:UIAbility和 ExtensionAbility。
如何启动一个ability
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
context = getContext(this) as common.UIAbilityContext; // UIAbilityContext
const want: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.system', // AppScope/app.json5 中找
abilityName: 'SecondAbility', // 去对应的ability内部找module.json5
// moduleName: 'entry' // moduleName非必选
parameters: { // 携带参数
}
};
this.context.startAbility(want, (err: BusinessError) => {
if (err.code) {
// 显式拉起Ability,通过bundleName、abilityName和moduleName可以唯一确定一个Ability
console.error(`Failed to startAbility. Code: ${err.code}, message: ${err.message}`);
}
});
显示want 和 隐式want的区别
- 显示want和隐式want的区别在于有无abilityName。有就是显示want,没有就是隐式want
- 显示want主要用于当前应用窗口跳转,隐式want打开其他应用的窗口
鸿蒙常用的装饰器有哪些?
- @State 定义状态,当前组件能使用
- @Prop 父子组件通信(特点:子组件数据不能修改)
- @Link 父子组件通信(特点:子组件数据可以修改)
- @Observed 和 @ObjectLink 父子组件通信(特点:嵌套第二层数据修改可以达到响应式,之前方案不行)
- @Provide 和 @Consume 祖孙组件通信
- @Builder 和 @BuilderParam 父子组件通信,通信组件数据
- @Watch 监视数据的变化(第一次不会触发)
页面和自定义组件生命周期有哪些
页面生命周期:
- onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
- onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
- onBackPress:当用户点击返回按钮时触发。
组件生命周期
-
aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其 build()函数之前执行。
-
onDidBuild:API12新增,组件 build()函数执行完成之后回调该接口,不建议在 onDidBuild函数中更改状态变量、使用 animateTo等功能,这会导致不稳定的UI表现。
-
aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改会导致应用程序行为不稳定。
如何进行数据持久化
1.用户首选项Preferences:轻量级的配置数据持久化方式,保存配置信息、用户偏好设置等。通过文本形式保存数据,不适合存储大量数据。
2.键值数据库(KV-Store):保存结构简单的数据,如商品名称、价格、工号等。
3.关系型数据库(RelationlStore):基于SQLite,保存包含复杂的数据,如学生信息,雇员信息等。提供一系列SQL操作,如增删改查。
如何进行全局状态管理
1.@Provide+@Consume装饰器,适用于整个组件树而言的“全局”的状态共享,且改动不频繁的场景。@Provide装饰器提供状态@Consume装饰器获取该状态。
2.AppStorage 适用于整个应用而言“全局”的变量或应用的主线程内多个UIAbility实例间的状态共享。
3.LocalStorage:适用于单个Ability而言“全局”的变量,主要用于不同页面间的状态共享。
LocalStorage在应用重启后数据会消失吗
会, localStoreage是一种用于页面或组件级别的数据存储方式,可以页面或组件的生命周期内存储和检索数据。LocalStorage的数据存储在内存中,应用重启后LocalStoreage中的数据会丢失。
父子组件如何通信
@Prop装饰器、@Link装饰器、@Provide和@Consume装饰器、@Event装饰器、@Parame装饰器、@Provider装饰器和@Consumer装饰器
当前(API 12)状态管理有两个版本 @Component和 @ComponentV2
1.父子单向数据传递@State + @Prop
2.父子双向传递 @State+@Link,@ObjectLink+@Link。
3.跨组件通信@Provide+@Consume,应用于后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。
4.@Objerved+ObjectLink,对于多层嵌套数据,比如数组元素存储的对象,或者对象属性为对象,它们的第二层属性变化是无法观察的。
@Prop和@ObjectLink装饰器有什么区别?
@Prop:是单向的数据传递,用于父组件向子组件传值,会深拷贝数据。
@ObectLink是组件内部共享状态,将一个对象的属性与另一个对象的属性连接,一个对象发生变化,另一个对象的属性也会自动更新。@ObjectLink是双向数据传递。
兄弟组件如何通信
1.通过公共组件传递。
2.使用全局状态管理(APPStorage、LocalStorage)存储共享数据。兄弟组件可以独立地读取和更新全局状态,实现通信。
Navigation组件跳转和router跳转有什么区别
- Navigation:是路由容器组件,适用于模块内和跨模块的路由切换,一次开发,多端部署场景。Router位于页面栈管理节点 stage 下面,不提供导航容器的概念。
- Navigation和 Router都支持跳转传参,但 Router对象中暂不支持方法变量。
- Navigation:支持清理指定路由,页面栈没有上限,可以无限跳转。Router不支持清理指定路由且页面栈最大为32,页面栈到达32之后必须清除之后才能继续跳转。
- Navigation:支持自定义转场动画和共享元素转场动画。 Router:仅支持简单自定义转场动画。
- Navigation:支持通过 setInterception 方法设置路由拦截。Router:不支持路由拦截。
- Navigation:支持沉浸式页面和模态嵌套路由。Router:不支持,需要通过窗口配置实现沉浸式页面。
总而言之,Navigation 组件在功能上更具丰富性和灵活性,特别是在处理复杂的导航结构、动效和路由管理方面。
而 Router 则提供了更基础的路由跳转功能,适合简单的路由需求。开发者可以根据应用的具体需求和设计选择最合适的路由方案。
LazyForEach是什么,以及它的工作原理?
LazyForEach相较于forEach允许开发者在用户滚动列表时才加载和渲染列表项,而不是一次性渲染整个列表,按需加载的方式可以显著提高应用的性能,特别是在处理大量数据时。它的原理是基于用户滚动的位置来动态创建和销毁列表项的组件实例。
多线程实现方式TaskPoll和Worker的区别
- TaskPool和Worker均支持多线程并发能力。由于TaskPool的工作线程会绑定系统的调度优先级,并且支持负载均衡(自动扩缩容),而Worker需要开发者自行创建,存在创建耗时以及不支持设置调度优先级,故在性能方面使用TaskPool会优于Worker,因此大多数场景推荐使用TaskPool。
- TaskPool偏向独立任务维度,该任务在线程中执行,无需关注线程的生命周期,超长任务(大于3分钟且非长时任务)会被系统自动回收;而Worker偏向线程的维度,支持长时间占据线程执行,需要主动管理线程生命周期。
跨设备通信方式有哪些
HarmonyOS支持多种跨设备通信方式,包括:
- 分布式软总线:一种高性能的通信机制,允许设备之间建立直接连接,进行数据传输。
- 蓝牙:使用标准的蓝牙技术进行设备间的通信。
- WLAN:通过WLAN网络实现设备间的通信。
- 远程服务调用:通过分布式任务调度实现跨设备的服务调用。