四、基于Stage模型的应用架构设计

前面我们了解了如何构建鸿蒙应用以及开发了第一个页面,这只是简单的demo;那么如何去设计,从0到1搭建一个真正的应用呢

一、基本概念

1、Stage模型基本概念

Stage模型概念图

AbilityStage:是一个Module级别的组件容器,在HAP首次加载时创建,做一些初始化等操作

Context:提供在运行期可以调用的各种资源和能力

UIAbility:是一种包含UI的应用组件,主要用于和用户交互,

ExtensionAbility组件是一种面向特定场景的应用组件,例如卡片场景的FormExtensionAbility

WindowStage:与UIAbility实例绑定,包含一个主窗口为ArkUI提供了绘制区域

Page:表示应用/服务的一个页面

2、包类型概念

使用场景

APP:用于应用上架发布到应用市场,可以包含多个hap/hsp

HAP:entry用于实现应用入口,以及应用的主功能,feature用于特性功能

HSP:多模块共享代码、运行时按需加载、元服务分包预加载

HAR:作为二方/三方库发布到仓库供其他依赖使用

如何选择HAR/HSP包

二、现有业务分析

在搭建框架之前我们需要对即将要开发的应用有个基本的认知

1、业务复杂度

业务的复杂度影响我们需不需要组件化开发,如果需要组件话开发,我们首先需要对当前对整体架构进行划分,通常会划分成三层架构:主工程(组合各业务打包) + 业务层(包括子业务及其公用的通用业务)+ 基础能力层(三方库及其二次封装)。

当然可能很多应用都是从Android转鸿蒙来的,所以我们可以针对现有的架构进行改造,满足鸿蒙应用需求

2、是否需要多任务
  • 传统设备上,应用是单任务单窗口的形式,在一些场景下,多任务多窗口的形态可以让用户获得更好的用户体验,比如文档编辑应用,可让用户同时打开编辑多个文档
  • Stage模型下UIAbility组件之间不会形成栈的结构,每个UIAbility组件实例都会创建一个类似独立应用一样的任务

在进行功能设计时,需要对应用本身是否支持多任务多窗口,结合起来考虑Ability组件的设计,这影响整体工程模块化的结构

  • 对于单Ability的情况下,单任务类(singleton模式)或者多任务类(multiton/specified模式)应用,如文档编辑应用,建议采用单HAP来承载UIAbility。
  • 对于多Ability有两种情况:
    • 对于多窗口类型的应用,如果功能不同,通过不同的UIAbility承载,如导航/打车应用,导航功能和主页属于不同的功能,要作为两个任务呈现给用户,可以将该模块作为Feature类型的HAP承载相应的UIAbility组件。
    • 对于应用的一些拓展功能如卡片、分享业务,其不会作为单独的任务和窗口形态运行,并且是由系统提供的独立ExtensionAbility来承载,从更好拆分业务来考虑,也建议通过Feature类型的HAP承载单独的ExtensionAbility组件。
3、是否有按需加载模块
  • 什么是按需加载:某个功能模块,使用时由用户决定安装时机,动态从应用市场下载安装使用
  • 按需加载的好处:减少包体积、减少系统资源

对于按需加载的模块可以设计成Feature类型的HAP或者HSP,两者区别在于Feature类型的HAP可以包含Ability组件

结合前面的是否需要多任务以及业务是否需要按需加载,将应用划分以下两个场景:

  • 单HAP工程:如果只包含一个UIAbility组件,无需使用ExtensionAbility组件,优先采用单HAP实现应用开发,按需加载使用HSP,其他使用HAR作为模块。
  • 多HAP工程:多个UIAbility组件实现多任务,或者需要使用ExtensionAbility组件实现拓展功能,可以采用多HAP(Entry+多Feature),每个HAP中包含一个UIAbility组件或者一个ExtensionAbility组件
4、是否需要“一多”开发

定义:一套代码工程,一次开发上架,多端按需部署

“一多”开发是鸿蒙的一大特性,可以让用户享受全场景体验,也能为应用带来潜在用户群体

“一多”推荐在应用开发过程中使用如下的“三层工程结构”。

  • common(公共能力层):用于存放公共基础能力集合(如工具库、公共配置等)。可编译成一个或多个HAR/HSP包,其只可以被products和features依赖,不可以反向依赖。
  • features(基础特性层):用于存放基础特性集合(如应用中相对独立的各个功能的UI及业务逻辑实现等)。不需要单独部署的feature通常编译为HAR包或HSP包,供products或其它feature使用,但是不能反向依赖products层。需要单独部署的feature通常编译为Feature类型的HAP包,和products下Entry类型的HAP包进行组合部署。features层可以横向调用及依赖common层。
  • products(产品定制层):用于针对不同设备形态进行功能和特性集成。products层各个子目录各自编译为一个Entry类型的HAP包,作为应用主入口,products层不可以横向调用。

代码工程结构抽象如下:

三、单HAP架构

对于单UIAbility应用的APP工程而言,其仅包含一个Entry类型的HAP,其划分的模块则是根据是否有按需加载的需求,来考虑采用HAR模块和HSP模块。

注意:这里说的仅有一个HAP指的是一种设备类型仅有一个HAP,而不是.app文件包里面仅有一个HAP。因为.app里面可以包含其他设备的HAP包,如手表、大屏,进行多设备分发。

1、不包含按需加载模块

对于不需要按需加载的单HAP类型App来讲,可以直接全部采用HAR进行开发设计,如上图phone.hap所示

设计成HAR包有如下好处:

  1. 全部编译进HAP,无额外的HSP,节省HSP的安装和加载成本。
  2. HAR在编译进HAP时,可以利用ArkTS的语言特性和编译器功能,做类型推断和编译优化。
  3. 代码工程架构简单,后续演进较为灵活。
2、包含按需加载模块

在单HAP工程内,如果要实现按需加载功能,那么对应的组件需要采用HSP作为按需加载组件模块,如上图tablet.hap。这种情况下,由于hsp和业务3har都依赖相同的har(基础库2/基础库3),使得它们在应用内存在多份。另一方面,HSP是动态库相比于HAR安装和加载均会有一些性能损失,过多的HSP可能会影响安装效率和App启动性能。所以需要根据业务实际情况,在App Size与特性启动性能之间做好平衡。

性能优先:对于性能比较敏感的,则不需要再封装一个公共的HSP模块,直接依赖公共HAR包

Size优先:对于App Size比较看重的,可以考虑将公共依赖的模块封装成为一个HSP模块壳

四、多HAP架构

对于同一个设备类型,如果要实现独立的功能模块,且具有单独入口的功能特性,建议做成一个独立特性的HAP,按需下载安装。此时一个App包中,就会有多个HAP包。多HAP之间业务独立,但是可能会有业务能力共享。

前面我们了解Feature类型的HAP和HSP包是相似的,所以多HAP架构和HAP+HSP组合类似,在包含公共能力模块的情况下需要考虑在App Size与启动性能之间做平衡

五、UI设计

1、ArkUI架构模式

ArkUI采取MVVM模式,其中状态管理模块起到的就是ViewModel的作用,将数据与视图绑定在一起,更新数据的时候直接更新视图

  • Model层:存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理。
  • View层:在ArkUI中通常是@Component装饰组件渲染的UI。
  • ViewModel层:在ArkUI中,ViewModel是存储在自定义组件的状态变量、LocalStorage和AppStorage中的数据。
    • 自定义组件通过执行其build()方法或者@Builder装饰的方法来渲染UI,即ViewModel可以渲染View。
    • View可以通过相应event handler来改变ViewModel,即事件驱动ViewModel的改变,另外ViewModel提供了@Watch回调方法用于监听状态数据的改变。
    • 在ViewModel被改变时,需要同步回Model层,这样才能保证ViewModel和Model的一致性,即应用自身数据的一致性。
    • ViewModel结构设计应始终为了适配自定义组件的构建和更新,这也是将Model和ViewModel分开的原因。

2、UI分层设计

视图层:包括组件/页面以及交互(touch、click等)

服务层:用于获取并处理数据,与界面进行绑定同时数据变化自动更新界面

数据层:提供原始数据,包括网络和本地数据

六、“一多”开发

OpenHarmony系统面向多终端提供了“一次开发,多端部署”(简称“一多”)的能力,让开发者可以基于一种设计,高效构建多端可运行的应用

前面我们了解了“一多”开发推荐三层结构,推荐在common目录中存放基础公共代码,features目录中存放相对独立的功能模块代码,product目录中存放完全独立的产品代码。

前面我们介绍单/多HAP架构就已经采用这种结构

如何实现“一多”的目标

  • 不同设备间的屏幕适配:自适应布局 + 响应式布局
  • 不同设备系统能力差异的兼容:SysCap机制

七、最佳实践

最后我们可以参考官方为我们提供的架构设计最佳实践:HMOS世界App

另外这里对当前有的Sample资源进行了汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630114.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

与禹老师学前端vue3学习汇总

24.5.15: 创建Vue3工程 1.确定自己电脑有没有nodejs环境,在cmd中输入node,如果出现Node.js的版本号说明已经有这个环境了,否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study,然后在这个空文件夹中右键选择终端…

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中,拼多多以其独特的团购模式吸引了众多消费者的目光。然而,随着市场竞争的加剧和消费者需求的多样化,一些商家发现自家店铺的流量持续低迷,销售业绩难以突破。面对这样的挑战,如何有效提升拼多多店铺的客…

Linux进程控制——Linux进程程序替换

前言:Linux进程控制包含了进程终止,进程等待,进程程序替换。走到现在我们也只剩下进程程序替换没介绍了,那么让我们来看看进程程序替换到底是什么! 本篇主要内容: 替换原理 替换函数 实现简易shell 我们所创…

不用投稿邮箱,怎样向各大新闻媒体投稿?

身为单位的信息宣传员,我深知肩上责任重大。每个月,完成单位在媒体上投稿发表文章的考核任务,就如同一场无声的赛跑,既要保证速度,更要注重质量。起初,我遵循“前辈们”的老路,一头扎进了邮箱投稿的海洋。但很快,现实给了我一记重拳——邮箱投稿的竞争犹如千军万马过独木桥,稿件…

C++ 中的 lambda 表达式

1.概念 lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用匿名类的operator()函数,这个函数可以被编译器内联优化(建议&#xff0…

20240511每日运维----聊聊nignx改配置所有的nginx改完unknow

1、改配置所有的nginx改完unknow src/core/nginx.h src/http/ngx_http_header_filter_module.c src/http/ngx_http_special_response.c src/http/v2/ngx_http_v2_filter_module.c 2、make 3、去objs里面把nginx文件替换过去sbin/nginx

Android系统不同版本存储权限

一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储(读写)权限,除了在AndroidManifest.xml文件里声明,app运行时也要动态申请使用对应的权限 提醒:应用私有存储不需要动态申请权…

在linux里登录远程服务器

在linux里登录远程服务器。在虚拟终端里输入命令: ssh 远程服务器ip -l username 然后输入登录密码,就可以登录到远程服务器的命令行界面。登录方便,字体也可以在本地机的虚拟终端里设置得大一点。 下面是一张截屏图片。

Linux|基础环境开发工具使用(1)

目录 Linux 软件包管理器 yum 什么是软件包 关于 rzsz 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux编辑器-vim介绍 vi与vim的相同点 vi与vim区别 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译…

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:11. 盛最多水的容器 - 力扣(LeetCode) class Solution {public int maxArea(int[] height) {//这道题比较特殊,因为两边是任意…

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件 ADS使用记录之使用RFPro进行版图联合仿真中已经简单介绍了使用RFPro对版图就行仿真的方法。但是,如果版图中含有一些非微带的结构,比如说电感、电容、晶体管呢,在此举例解释一下。 …

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势,传统经济向数字化经济转型的发展方向可以说是大势所趋,如何把握先机,率先迈出数字化转型第一步,可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者,五丰黎红踩着时…

基于Java的飞机大战游戏的设计与实现(论文 + 源码)

关于基于Java的飞机大战游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313362 基于Java的飞机大战游戏的设计与实现 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication &#x…

深度学习设计模式之抽象工厂模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习抽象工厂模式,抽象工厂模式创建的是对象家族,比如:苹果是一个产品,但是他不单单只生产手机,还…

欢乐钓鱼大师攻略大全,新手钓鱼入坑必备攻略!

《欢乐钓鱼大师》是一款深受玩家喜爱的钓鱼手游,在游戏中,玩家可以通过升级和更换鱼竿来享受钓鱼的乐趣,并有机会钓到各种稀有鱼类。然而,很多玩家在闯关过程中遇到了不少困难。为了帮助大家更好地掌握游戏技巧,小编特…

手机怎么下载别人直播间视频

手机下载直播视频,您需要按照以下步骤进行操作: 1. 打开直播平台,获取正在直播的链接,就是直播间的地址,然后粘贴在直接视频解析工具里,就可以同步下载直播视频画面。 2. 获取直播视频解析工具方法&#…

Java入门基础学习笔记24——While循环和do-while循环

1、While循环: 例1: package cn.ensource.loop;public class WhileDemo3 {public static void main(String[] args) {// 目标:掌握while循环的书写格式,以及理解其执行流程// 需求:打印多行Hello Worldint i 0;while…

【C++】:string类的基本使用

目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…