202406鸿蒙应用面试题&答案解析

总览:
Stage模型
应用上下文Context
共享包:HSP、HAR
装饰器
生命周期
路由
数据管理技术
并发问题
API
卡片
性能优化
待续…

1、Stage模型


在这里插入图片描述

1、由AbilityStage,创建出UIAbility,我们创建的Ability继承了UIAbility
2、UIAbility 创建 WindowStage 
3、WindowStage 创建 Window
4、Window 展示 Page

2、应用上下文Context

Context
ApplicationContext
AbilityStageContext
UIAbilityContext
ExtensionContext
ServiceExtensionContext/FormExtensionContext
  • 各类Context的继承关系
    在这里插入图片描述
  • 各类Context的持有关系
    在这里插入图片描述
  • 获取UIAbilityContext
// 在UIAbility中可以通过this.context获取UIAbility实例的上下文信息。
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 获取UIAbility实例的上下文
    let context = this.context;
    ...
  }
}
// 在页面中获取UIAbility实例的上下文信息
import common from '@ohos.app.ability.common';

@Entry
@Component
struct Index {
  // getContext(this) 返回的是Context
  private context = getContext(this) as common.UIAbilityContext;
}
  • 获取ApplicationContext,应用级别的Context。
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let applicationContext = this.context.getApplicationContext();
    ...
  }
}

3、共享包:HSP、HAR

  • HAR(Harmony Archive)静态共享包
  • HSP(Harmony Shared Package)动态共享包
  • 区别
HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝
HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份
  • HSP旨在解决HAR存在的几个问题
多个HAP引用相同的HAR,导致的APP包大小膨胀问题。
多个HAP引用相同的HARHAR中的一些状态变量无法共享的问题。

4、装饰器

  • 【自定义组件】相关装饰器
@Builder装饰器:自定义构建函数(组件内、全局)
@BuilderParam装饰器:引用@Builder函数
wrapBuilder:封装全局@Builder
@Styles装饰器:定义组件重用样式(组件内、全局)
@Extend装饰器:定义扩展组件样式(仅支持在全局定义)
stateStyles:多态样式
@AnimatableExtend装饰器:定义可动画属性(仅支持定义在全局),让不可动画属性具有动画属性
@Require装饰器:校验构造传参
  • 【组件】状态相关装饰器
@State装饰器:组件内状态
@Prop装饰器:父子单向同步
@Link装饰器:父子双向同步
@Provide装饰器和@Consume装饰器:与后代组件双向同步
@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
  • 【应用】状态相关装饰器
LocalStorage:页面级UI状态存储
AppStorage:应用全局的UI状态存储
PersistentStorage:持久化存储UI状态
Environment:设备环境查询
  • 其他状态相关装饰器
@Watch装饰器:状态变量更改通知
$$语法:内置组件双向同步
@Track装饰器:class对象属性级更新
@Concurrent装饰器:校验并发函数(使用TaskPool时,用到)

5、生命周期

6、路由

7、数据管理技术

8、并发问题

9、API

10、卡片


在这里插入图片描述

11、性能优化

  • 布局性能提升
1、使用Column/Row代替Flex。
2、大小不需要变更的子组件主动设置flexShrink属性值为03、优先使用layoutWeight属性替代flexGrow属性和flexShrink属性。
4、子组件主轴长度分配设置为最常用场景的布局结果,使子组件主轴长度总和等于Flex容器主轴长度。
  • 设置List组件的宽高
在使用Scroll容器组件嵌套List组件加载长列表时,若不指定List的宽高尺寸,则默认全部加载。

Scroll嵌套List时:
1、List没有设置宽高,会布局List的所有子组件。
2、List设置宽高,会布局List显示区域内的子组件。
3、List使用ForEach加载子组件时,无论是否设置List的宽高,都会加载所有子组件。
4、List使用LazyForEach加载子组件时,没有设置List的宽高,会加载所有子组件,设置了List的宽高,会加载List显示区域内的子组件。
  • 使用显隐控制替代条件渲染
可使用visibility通用属性控制组件的显隐状态时代替if条件渲染,其中Hidden性能最优,其次是None
  • 减少应用滑动白块
1、应用通过增大List/Grid控件的cachedCount参数,调整UI的加载范围。cachedCount表示屏幕外List/Grid预加载item的个数。

2、如果需要请求网络图片,可以在item滑动到屏幕显示之前,提前下载好内容,从而减少滑动白块。
  • 合理使用ForEach/LazyForEach
1、减少使用LazyForEach的重建机制刷新UI【通过@Observed和@ObjectLink配合,代替reloadData()2、ForEach遍历使用key值提升性能
3、在ForEach中使用自定义组件搭配对象数组
  • 使用@ObjectLink代替@Prop减少不必要的深拷贝
  • 不使用状态变量强行更新非状态变量关联组件
  • 精准控制状态变量关联的组件数
  • 避免在for、while等循环逻辑中频繁读取状态变量

12、未完待续…

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值