鸿蒙面试题(持续更新)

鸿蒙开发

一、生命周期

  • 应用生命周期涵盖了从应用启动到销毁的整个过程,包括应用的创建、初始化、前台运行、后台运行和销毁等阶段。这个过程通过特定的回调函数实现,开发者可以在这些回调中执行相应的操作。具体来说,应用的生命周期函数包括:

    • onCreate(want, launchParam):应用启动时调用,用于初始化应用所需的数据和资源。

    • [onWindowStageCreate](){"sa":"re_dqa_zy","icon":1}:应用窗口创建时调用,用于设置要加载的页面。

    • [onBackground](){"sa":"re_dqa_zy","icon":1}:应用从前台切换到后台时触发,用于释放不再需要的资源或执行后台任务。

    • onForeground:应用从后台切换到前台时调用,用于重新申请资源或准备前台运行。

    • onWindowStageDestroyonDestroy:应用窗口销毁和应用销毁时调用,用于释放所有占用的系统资源并保存必要的数据。

  • 页面生命周期专注于页面显示和隐藏时的操作,包括:

    • [onPageShow](){"sa":"re_dqa_zy","icon":1}:页面显示时触发,用于执行页面显示时的操作。

    • [onPageHide](){"sa":"re_dqa_zy","icon":1}:页面隐藏时触发,用于执行页面隐藏时的操作。

    • [onBackPress](){"sa":"re_dqa_zy","icon":1}:用户点击返回按钮时触发,不同于页面的路由返回或按钮返回。

  • 组件生命周期则关注自定义组件的创建、显示、隐藏和销毁过程,包括:

    • aboutToAppear:组件即将出现时回调,在创建自定义组件的新实例后、执行其build()函数之前执行。

    • aboutToDisappear:在自定义组件析构销毁之前执行

二、你对ability的看法

Ability具有分布式特性 : 不仅能支持单个设备上的应用开发和部署,更能打破设备界限,实现服务在不同设备间的自由流动和共享。

Ability还非常轻量化与灵活 : AbilitySlice可以细粒度地组织应用逻辑,将应用界面分割成更小的功能单元。这些单元不仅可以在同一设备的不同窗口独立加载和呈现,还能跨设备间实现

Ability强调了统一接口与低耦合 : 通过统一的AbilityContext接口,各类型Ability之间的相互调用和数据交互变得更为简洁和标准化。这种设计使得应用开发更加高效和便捷。

Ability在Stage模型的支持下,实现了对传统Activity模型的超越。特别是在跨设备协同和资源优化方面,鸿蒙的Ability展现出了更强的优势。这使得鸿蒙系统更适合未来物联网环境下多形态智能设备的应用开发

三、Arkts的语言优势

1.多语言兼容性:鸿蒙ARKTS语言是一种多语言兼容的编程语言,可以同时支持多种 编程语言,如java、C++等。这使得开发者可以在同一个项目中使用不同的编程语言来编 写代码,提高了开发效率和灵活性。 ​ 2.高效性能:鸿蒙ARKTS语言采用了静态编译技术,可以在编译阶段对代码进行优化,提高程序的执行效率。同时,鸿蒙ARKTS还支持并行计算和异步编程模型,可以充分利用多核处理器的性能优势,提高程序的运行速度。 ​ 3.简洁易用:鸿蒙ARKTS语言具有简洁易用的语法特性,使得开发者可以用更少的代码实现同样的功能。同时,鸿蒙ARKTS还提供了丰富的开发工具和文档支持,使得开发者可以快速上手并进行快速迭代开发, ​ 4.安全可靠:鸿蒙ARKTS语言在设计上注重安全性和可靠性。它提供了严格的类型检查和内存管理机制,可以减少程序中出现的潜在错误和内存泄漏问题。此外,鸿蒙ARKTS还支持安全沙箱机制,可以有效隔离应用程序,提高系统的安全性。

四、常见的装饰器

1.@Entry

用来装饰 struct 使用表示页面的入口

2.@Component

装饰 struct, 表示该 struct 具有基于组件的能力 保证 struct 内部 包含一个且只能包含一个 build() 函数, 用于绘制 UI 界面 struct 内部, build() 函数外部, 用于存储数据的位置 注意 : build() 函数内部必须要有容器组件

3.@State

用来装饰变量的装饰器( 其实就是用于定义变量 )

必须本地初始化数据, 支持通过构造函数赋值

当 @State 定义的数据被修改的时候, 所在组件的 build() 方法会被重新调用, 重新绘制所在 UI 界面

4.@Prop

继承了 @State 的所有功能 注意 : 定义的时候可以不需要本地直接初始化, 调用子组件的时候需要对其进行赋值 被 @Prop 装饰的变量可以和父组件建立单向同步关系 @Prop 装饰的变量是可变的, 但是修改时不会同步回父组件, 当父组件的 @State 变化时, 本地修改的 @Prop 会被覆盖

5.@Link

@Link 装饰的变量和父组件会构建双向同步关系 父组件会接受来自 @Link 装饰的变量的修改同步 父组件的更新也会同步给 @Link 装饰的变量 @Link 装饰的变量与其父组件中的数据源共享相同的值 注意 : 子组件使用 @Link 定义变量的时候不需要赋值, 而是调用子组件的时候进行赋值 调用子组件赋值的时候使用 "$变量名" 的形式进行赋值 @Link 装饰器不能再 @Entry 装饰的自定义组件中使用 6.@Provide 和 @Consume (层级过深时建议使用)

@Provide('名字') 变量名: 类型 = 赋值

@Consume('名字') 变量名

注意 : @Provide 和 @Comsume 处使用的名字要一致, 但是变量名不需要一致

使用发布订阅模式, 父类使用 @Provide, 其他需要观察的子类使用 @Consume, 就可以实现双向绑定 当层级很深时, 不需要一层一层传递数据, 直接使用发布订阅进行监听就能实现相同的效果 @Provide 和 @Consume 可以通过相同的变量名或者相同的变量别名绑定, 但是变量类型必须相同 @Provide 必须设置初始值, @Consume 不可以设置默认初始值 @Provide 修饰的变量和 @Consume 修饰的变量可以是一对多的关系 7.@Watch

使用观察者模式的装饰器

注意 : 该装饰器不是触发变量变化, 而是绑定一个函数, 当监控的变量发生变化时, 该函数触发

语法 : @Watch('函数名')

8.@Builder @Builder 是 ArkUI 提供的一种更加轻量的复用机制 因为在 @Component 内能且只能创建一个 build() 函数 我们可以在组件内利用 @Builder 装饰器自定义一个构建函数 @Builder 创建的构建函数遵循 build() 函数的语法规则, 并且可以在 build() 函数内调用 语法 : 定义语法 : @Builder MyBuilder() {} 使用语法 : this.MyBuilder() {} 语法要点 自定义构建函数可以在所属组件内的 build() 方法和其他自定义构建函数内调佣, 但不允许在组件外调用 允许在自定义组件内定义一个或多个 @Builder 方法, 该方法被认为是该组件的私有成员 在自定义函数体内, this 指代当前所属组件, 组件的状态变量可以在自定义构建函数内访问 自定义构建函数不仅可以添加属性, 还可以添加事件

在组件外也可以使用 @Builder 创建一个自定义构建函数

注意 : 在组件外使用 @Builder 的时候, 构建函数内不能使用 this

9.@Styles

在开发中有的时候, 有的时候我们的一些样式也要重用

@Styles 装饰器就可以将多条样式提炼成一个方法, 以供复用

和 @Builder 一样, 可以定义在 组件内 和 组件外

10.@Extend装饰的方法同样可用于组件样式的复用,与@Styles不同的是,@Extend方法只能定义在全局。并且@Extend方法只能用于指定类型的组件,例如以下方法只能用于Button组件(可以理解为是Button组件的扩展样式)

  1. @Extend方法只能定义在全局,使用范围目前只限于当前的.ets文件

  2. @Extend方法用于特定类型的组件,因此可包含该组件的专有属性方法专有事件方法

  3. @Extend方法支持参数

五、鸿蒙提供的分布式应用技术的实现方式

1.设计数据库架构:首先,需要设计数据库的架构,包括分布式数据库的拓扑结构和数据分片策略。考虑到鸿蒙应用的分布式特点,可以选择主从复制、分片、分区等技术来实现数据的分布式存储和访问。

2.数据分片和复制:将数据按照一定的规则进行分片,并将分片的数据复制到不同的节点上。可以选择同步复制或异步复制的方式,保证数据在分布式环境中的一致性。

3.数据访问和查询:设计合适的数据访问接口和查询语言,使应用可以通过统一的接口访问和查询分布式数据库。可以使用分布式事务、一致性哈希等技术来实现数据的快速访问和查询。

4.数据同步和一致性:在分布式环境中,需要考虑数据的同步和一致性。可以通过分布式锁、分布式事务等技术来解决数据同步和一致性的问题。

5.故障恢复和容错:在分布式数据库中,需要考虑节点故障和网络故障的恢复和容错机制。可以使用备份、冗余和故障转移等技术来保证数据的可用性和可靠性。

六、应用级状态管理

1.LocalStorage用于存储页面级的状态数据,位于LocalStorage中的状态数据可以在一个页面内的所有组件中共享,其用法如下

第一步:创建LocalStorage实例,并初始化状态变量

第二步:将LocalStorage实例绑定到页面的入口组件

第三步:在页面内的组件访问LocalStorage:ArkTs提供了两个装饰器用于访问LocalStorage,分别是@LocalStorageProp@LocalStorageLink,前者可以和LocalStorage实现单向同步,后者可以和LocalStorage实现双向同步,具体用法如下

2.AppStorage用于存储应用级的状态数据,位于AppStorage中的状态数据可以在整个应用的所有组件中共享,其用法如下

第一步:初始化状态变量

第二步:在整个应用内的组件中访问AppStorage

ArkTs提供了两个装饰器用于访问AppStorage实例,分别是@StorageProp@StorageLink,前者可以和AppStorage实现单向同步,后者可以和AppStorage实现双向同步

3.LocalStorageAppStorage都是将状态数据保存在内存中,应用一旦退出,数据就会被清理,如果需要对数据进行持久化存储,就需要用到PersistentStorage,其用法如下

PersistentStorage可以将指定的AppStorage中的属性保存到磁盘中,并且PersistentStorageAppStorage的该属性会自动建立双向同步,开发者不能直接访问PersistentStorage中的属性,而只能通过AppStorage进行访问

七、网络请求

开发网络权限 :在model.json5文件中的module模块下添加如下请求权限

{
"module" : {
    "requestPermissions":[
       {
         "name": "ohos.permission.INTERNET"
       }
    ]
}

}

八、Stage模型基本概念

Stage模型贯穿一个鸿蒙应用的整个生命周期,从源码到编译再到运行,都会涉及到Stage模型相关的概念。

九、Stage模型配置文件

基于Stage模型创建的工程,有两个重要的配置文件,一个是应用级的配置文件app.json5,另一个是模块级的module.json5

app.json5用于配置整个应用的基本信息,包括应用的包名、开发厂商、版本号等。

module.json5用于配置当前模块的各项信息,包括基本信息(例如名称、类型、描述、支持的设备类型等)、Ablitity组件信息、所需权限等

十、鸿蒙应用如果发生了内存泄露如何解决?

1.使用鸿蒙开发者工具:

鸿蒙提供了开发者工具,其中包括性能分析和内存分析工具。使用这些工具来监测应用的内存使用情况,找到潜在的内存泄漏问题。

2.生命周期管理:

确保正确管理鸿蒙应用组件的生命周期。释放不再需要的资源,避免在组件销毁后仍然持有对它的引用。

3.避免全局引用:

避免在应用中持有全局引用,尤其是全局单例或静态变量。这些引用可能导致对象无法被垃圾回收,从而导致内存泄漏。

4.定期进行内存测试:

运行应用并通过鸿蒙开发者工具的性能分析工具进行内存测试。通过模拟各种使用场景,找到潜在的内存泄漏问题

十一、请介绍一下鸿蒙操作系统的特点和优势

分布式技术:鸿蒙操作系统采用分布式技术,能够将不同的设备连接在一起,实现设备之间的数据共享和协同工作。

微内核架构:鸿蒙操作系统采用微内核架构,具有更高的安全性和稳定性。

全场景支持:鸿蒙操作系统支持多种设备,包括手机、平板、智能穿戴设备、智能家居、车载等,实现了全场景覆盖。

开放生态:鸿蒙操作系统是一个开放的生态系统,支持第三方应用开发者加入,为用户提供更多的应用和服务。

流畅体验:鸿蒙操作系统采用了先进的技术,能够提供更加流畅的用户体验,包括更快的启动速度、更低的内存占用等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值