一、请简要描述HarmonyOS及其关键特点
HarmonyOS是由华为公司研发的一款面向未来、基于微内核的全场景分布式操作系统,该操作系统旨在为用户提供无缝的跨设备体验,能够在当前多种终端设备是运行,实现设备间的互联互通。它主要有以下关键特点:
1、微内核架构:采用微内核设计,使得设计更为轻量级、高效且安全,可以灵活地适应各种类型的设备
2、分布式能力:允许开发者构建跨设备的应用,使设备能够协同工作,如超级终端概念,让多设备融为一体
3、多屏协调:支持多设备间的无缝连接和交互
4、服务卡片:类似于其他操作系统上的小部件或者快捷方式,服务卡片让用户快速访问应用的特定功能,而无需完整打开应用
5、兼容性:尽管HarmonyOS是一个独立的操作系统,但它支持运行Android应用程序,从而确保了应用生态的丰富性和过渡期的平滑
6、一次开发多端部署:开发者只需要编写一次代码,即可在多种设备上运行,降低了开发成本和复杂度
二、讲一下鸿蒙app开发中的生命周期
在鸿蒙应用开发中,应用的生命周期管理至关重要,因为他直接影响到应用的性能、用户体验以及资源管理。鸿蒙应用的基本结构单位是Ability,而Ability又可以进一步细分为不同的AbilitySlice。
1、UIAbility生命周期
UIAbility是鸿蒙应用的主要入口,负责界面的呈现于交互,生命周期主要有以下几个阶段:
- onCreate() :当Ability首次创建时调用
- onWindowStageCreate() :当Ability的窗口被创建时调用
- onForeground() :当Ability进入前台时调用
- onBackground() :当Ability被置于后台时调用
- onWindowStageDestroy() :当Ability的窗口被销毁前调用
- onDestroy() :当Ability被销毁前调用
2、页面生命周期
页面是Ability的一部分,通常用来展示用户界面。页面有自己的生命周期,包括:
- onPageShow() :当页面可见时调用
- onPageHide() :当页面不可见时调用
- onBackPress() :当用户按下返回键时调用,用于处理返回操作
3、组件生命周期
组件是构成页面的基本单元,每个组件也有自己的生命周期,用于管理其显示和隐藏状态:
- aboutToAppear() :当组件即将变为可见状态时调用
- aboutToDisappear() :当组件即将变为不可见状态时调用
- aboutToReusable() :API10及以上版本中,当组件从可视状态转变为不可视状态,但可能被复用时调用
- aboutToRecycle() :API10及以上版本中,当组件完全不可见且不再需要保留其状态时调用
生命周期回调的意义
生命周期回调提供了在特定时间执行代码的机会,比如在Ability进入前台时加载数据,在退出前台时保存数据或者释放资源,合理利用生命周期回调可以使应用更加健壮、响应速度更快、资源控制更加合理。
例如:在onCreate() 中可以初始化日志模块,在onPageShow()可以恢复动画,在onPageShow()可以暂停动画,在onBackground()可以清理不再需要的资源,以节省内存
三、HarmonyOS的ArkUI中的UIAbility是什么
是构成应用程序的一个关键组件,它代表了具有用户界面的应用组件,主要负责与用户进行交互。UIAbility可以被看作是安卓应用中的Activity的类似物,但其设计和功能更加现代化。
1、用户界面载体:UIAbility为应用提供了一个窗口,这个窗口是ArkUI绘制和显示用户界面的区域
2、系统调度单元:它是系统调度的基本单元,系统会根据UIAbility的生命周期来管理应用的运行状态和资源分配
3、应用组件:一个应用可以有多个UIAbility实例,这允许应用在不同的情景下提供多个独立的交互界面。每个UIAbility都可以有自己的生命周期,并且可以独立于其他UIAbility运行
4、生命周期管理:UIAbility具有完整的生命周期
5、窗口管理:UIAbility通过WindowStage持有窗口,为ArkUI提供了绘制区域。WindowStage是窗口的高级抽象,他管理者窗口的布局和行为
6、上下文提供者:UIAbility及其派生类向开发者提供运行时可以调用的各种能力,如访问应用资源、启动其他Ability等,这些通过Context接口实现
7、启动模式:UIAbility有不同的启动模式,这些模式决定了UIAbility实例在启动时的行为,比如单例模式、标准模式等,这影响了应用的导航和多任务处理方式
8、组件协同:UIAbility还支持与其他组件协同工作,这包括与其它Ability或服务进行通信,以及参与分布式场景下的跨设备协作
四、说几个常见的装饰器
- @Entry:用于标记一个特定的组件为应用的入口点。也就是说,当你的HarmonyOS应用启动时,系统会首先加载带有
@Entry
装饰器的组件。这个组件通常是应用的主界面或启动页,是用户与应用互动的第一个接触点。 - @Component:用于定义一个组件。它主要用于组件的注册和配置,是ArkUI框架中定义可重用UI组件的关键部分。当你使用@Component装饰器时,你实际上是告诉ArkUI框架这个类是一个组件,并且提供了该组件的元数据,比如它的模板、样式、名称等
- @State:用来定义组件的状态(state)的。它用于标识类中的某个属性是组件的响应式状态,这意味着当这个状态发生变化时,组件会自动重新渲染,以反映最新的状态值。这种机制是基于Vue.js的响应式系统,使得状态管理变得简单且直观。
- @Prop:继承了@State的所有功能,但是定义的时候可以不初始化,调用子组件的时候需要对其进行赋值。被其装饰的变量可以和父组件建立单向同步关系,父变子变,子变父不变
- @Link:实现父子双向变量同步变化
- @Provide:用于在组件中提供一个可注入的数据或方法。当一个组件使用@Provide时,他会向下传递数据或方法,使得其子组件可以访问到这些数据或方法,而无需显示的通过props逐层传递
- @Consume:用于在组件中消费或注入由父组件通过@Provide提供的数据或者方法
- @Watch:用于监视组件的特定数据属性的变化,当被监视的属性值发生变化时,@Watch装饰器关联的函数将被自动调用,允许你执行相应的副作用操作,如数据处理、状态更新或者其他逻辑。它还支持一些额外选项,如添加一个immediate: true选项,使监视器在组建初始化时立即调用一次,即使属性的值尚未改变。如果你的属性是对象或数组,并且你希望监视其内部属性的变化,可以使用deep:true选项。
- @Builder:是 ArkUI 提供的一种更加轻量的复用机制 因为在 @Component 内能且只能创建一个 build() 函数 我们可以在组件内利用 @Builder 装饰器自定义一个构建函数 @Builder 创建的构建函数遵循 build() 函数的语法规则, 并且可以在 build() 函数内调用 语法
- @Styles:提炼统一复用的样式
- @Extend:同样可用于组件样式的复用,与@Styles不同的是,@Extend方法只能定义在全局。并且@Extend方法只能用于指定类型的组件。
五、鸿蒙提供的分布式应用技术的实现方式有哪些?
-
分布式软总线(Distributed SoftBus): 分布式软总线是鸿蒙系统的核心技术之一,它提供了设备间通信的能力,包括数据传输、远程调用和设备发现等功能。通过软总线,不同设备上的应用可以像在同一设备上一样进行通信和数据交换。
-
分布式数据管理(Distributed Data Management): 这项技术允许应用在多设备之间共享和访问数据,比如文件、数据库和用户偏好设置等。开发者可以使用统一的API在不同设备上存储和读取数据,而不需要关心数据具体存储在哪台设备上。
-
分布式任务调度(Distributed Task Scheduling): 分布式任务调度使应用能够在最合适的设备上运行,根据设备的能力和当前状态智能分配任务。例如,如果用户的手机电量低,应用可以自动将视频播放任务转移到平板电脑上。
-
分布式硬件能力(Distributed Hardware): 鸿蒙系统可以将不同设备的硬件资源(如摄像头、麦克风、扬声器等)虚拟化,让应用能够跨设备访问和使用这些资源。这使得应用能够利用整个设备网络的能力,而不是受限于单一设备的硬件限制。
-
分布式安全(Distributed Security): 鸿蒙系统提供了一套完整的安全框架,确保在分布式场景下的数据和通信安全。这包括身份认证、权限管理和加密通信等措施,保证用户隐私和数据安全。
-
分布式UI(Distributed UI): 应用可以基于设备的形态和屏幕大小动态调整界面布局,提供一致的用户体验。例如,应用可以根据设备类型自动切换到适合手机、平板或电视的界面布局。
-
分布式服务(Distributed Services): 开发者可以将应用的部分功能封装成服务,这些服务可以被其他应用调用,从而实现模块化和重用。分布式服务可以跨越设备边界,实现功能的灵活组合和扩展。
六、鸿蒙应用如果发生了内存泄露如何解决?
-
使用鸿蒙开发者工具:利用DevEco Studio中的性能分析工具,特别是内存分析工具,来监控应用的内存使用情况。这些工具可以帮助你找到潜在的内存泄漏点。
-
生命周期管理:确保正确管理应用组件的生命周期,如
Ability
和AbilitySlice
。在组件销毁时释放不再需要的资源,避免持有对已销毁组件的引用。 -
避免全局引用:避免在应用中使用全局单例或静态变量持有对象引用,因为这些引用可能导致对象无法被垃圾回收,从而引起内存泄漏。
-
资源回收:在适当的时机手动释放资源,例如关闭数据库连接、释放文件句柄、清理不再需要的位图等。确保在资源不再需要时主动释放它们。
-
避免匿名内部类和Handler泄漏:在匿名内部类或Handler中引用外部类时,确保正确处理生命周期,避免造成外部类的引用泄漏。可以考虑使用弱引用避免强引用造成泄漏。
-
检查WebView使用:如果应用使用了WebView,需要特别注意内存管理,因为WebView可能因缓存和JavaScript桥接等原因导致内存泄漏。确保在不再需要时释放WebView资源。
-
代码审查和重构:定期进行代码审查,查找可能导致内存泄漏的编程习惯或错误。重构代码以消除不必要的引用和优化资源管理。
-
使用内存分析工具:除了鸿蒙内置的工具外,还可以考虑使用其他内存分析工具,如MAT(Memory Analyzer Tool),来深入分析内存使用情况,找出泄漏源。
-
测试和监控:在不同设备和不同场景下测试应用,确保在所有预期的使用场景中都不会出现内存泄漏。使用性能监控工具定期检查应用的内存使用情况。
-
学习和遵循最佳实践:学习并遵循内存管理的最佳实践,了解常见的内存泄漏模式和避免策略。