应用模型:应用模型是系统为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。
应用组件
应用进程模型
应用线程模型
应用任务管理模型(仅对系统应用开放)
应用配置文件
Context及其派生类向开发者提供在运行期可以调用的各种资源和能力(如当前应用信息,应用文件路径等)。
AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。
UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。
每个UIAbility实例都会与一个WindowStage类实例绑定,该类起到了应用进程内窗口管理器的作用。
它包含一个主窗口。也就是说UIAbility实例通过WindowStage持有了一个主窗口,该主窗口为ArkUI提供了绘制区域。
ExtensionAbility组件是基于特定场景(例如服务卡片、输入法等)提供的应用组件,以便满足更多的使用场景。
应用安装和运行的基本单元。
静态共享包,编译态复用。
作为二方库(发布到OHPM私仓)和三方库(发布到OHPM中心仓)
动态共享包,运行时复用。
它主要服务于分布式应用场景,支持多设备间的协同工作和数据共享。
Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。
可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。
在UIAbility的UI可见之前,如UIAbility切换至前台时触发。
可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。
在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。
可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。
WindowStage创建完成后会进入onWindowStageCreate()回调
可以在该回调中设置UI加载、设置WindowStage的事件订阅。
在WindowStage销毁前执行,此时WindowStage可以使用。
在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,
可以在该回调中释放UI资源。
Destroy状态在UIAbility实例销毁时触发
可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。
页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
当用户点击返回按钮时触发。
即被@Entry装饰的组件生命周期
组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
即一般用@Component装饰的自定义组件的生命周期
@Component装饰器仅能装饰struct关键字声明的数据结构。
@Entry装饰的自定义组件将作为UI页面的入口。
@Reusable装饰的自定义组件具备可复用能力
@Builder装饰的函数也称为“自定义构建函数”。
按引用传递参数时,如果在@Builder方法内调用自定义组件,ArkUI提供$$作为按引用传递参数的范式。
全局@Builder作为wrapBuilder的参数返回WrappedBuilder对象,实现全局@Builder可以进行赋值和传递。
@LocalBuilder装饰器: 维持组件父子关系
@LocalBuilder拥有和局部@Builder相同的功能,且比局部@Builder能够更好的确定组件的父子关系和状态管理的父子关系。不会失去this的指向,@LocalBuilder装饰函数中this指向依然是本组件
@BuilderParam装饰器:引用@Builder函数
@BuilderParam用来装饰指向@Builder方法的变量(@BuilderParam是用来承接@Builder函数的)。
开发者可以在初始化自定义组件时,使用不同的方式(如:参数修改、尾随闭包、借用箭头函数等)对@BuilderParam装饰的自定义构建函数进行传参赋值,在自定义组件内部通过调用@BuilderParam为组件增加特定的功能。
该装饰器用于声明任意UI描述的一个元素,类似slot占位符。
@Require是校验@Prop、@State、@Provide、@BuilderParam和普通变量(无状态装饰器修饰的变量)是否需要构造传参的一个装饰器。
@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。
当前@Styles仅支持通用属性和通用事件。
用于扩展原生组件样式。
@AnimatableExtend装饰器:定义可动画属性
@AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。也可通过逐帧回调函数每帧修改可动画属性的值,实现逐帧布局的效果。
构建一个动态的、有交互的界面,就需要引入“状态”的概念。
自定义组件拥有变量,变量必须被装饰器装饰才可以成为状态变量,状态变量的改变会引起UI的渲染刷新。
运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。
@State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型和本地初始化。
@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。
@Prop装饰变量时会进行深拷贝,在拷贝的过程中除了基本类型、Map、Set、Date、Array外,都会丢失类型。
@Link装饰的变量与其父组件中的数据源共享相同的值。
@Provide装饰器和@Consume装饰器:与后代组件双向同步
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。
@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
被@Observed装饰的类,可以被观察到属性的变化;
子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中的属性,这个属性同样也需要被@Observed装饰。
@LocalStorageProp装饰的变量与LocalStorage中给定属性建立单向同步关系。
@LocalStorageLink装饰的变量与LocalStorage中给定属性建立双向同步关系。
LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。
LocalStorage是页面级的,通常应用于页面内的数据共享
LocalStorage支持UIAbility实例内多个页面间状态共享。
@StorageProp(key)是和AppStorage中key对应的属性建立单向数据同步
@StorageLink(key)是和AppStorage中key对应的属性建立双向数据同步
AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。
AppStorage是应用级的全局状态共享,还相当于整个应用的“中枢”,持久化数据PersistentStorage和环境变量Environment都是通过AppStorage中转,才可以和UI交互。
PersistentStorage:持久化存储UI状态
PersistentStorage是应用程序中的可选单例对象。此对象的作用是持久化存储选定的AppStorage属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。
UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。
Environment是ArkUI框架在应用程序启动时创建的单例对象。它为AppStorage提供了一系列描述应用程序运行状态的属性。
Environment的所有属性都是不可变的(即应用不可写入),所有的属性都是简单类型。
@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。
$$运算符为系统内置组件提供TS变量的引用,使得TS变量和系统内置组件的内部状态保持同步。
$$还用于@Builder装饰器的按引用传递参数
@Track是class对象的属性装饰器。当一个class对象是状态变量时,@Track装饰的属性发生变化,只会触发该属性关联的UI更新;而未被标记的属性不能在UI中使用。
自定义组件处于非激活状态时,状态变量将不响应更新,即@Watch不会调用,状态变量关联的节点不会刷新。
通过freezeWhenInactive属性来决定是否使用冻结功能,不传参数时默认不使用。
支持的场景有:页面路由,TabContent,LazyForEach,Navigation。
可根据应用的不同状态,渲染对应状态下的UI内容。
可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件。
从数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。
如果布局内子元素超过1个时,且能够以某种方式线性排列时优先考虑此布局。
组件需要有堆叠效果时优先考虑此布局。层叠布局的堆叠效果不会占用或影响其他同容器内子组件的布局空间。
弹性布局是与线性布局类似的布局方式。区别在于弹性布局默认能够使子组件压缩或拉伸。在子组件需要计算拉伸或压缩比例时优先使用此布局,可使得多个容器内子组件能有更好的视觉上的填充效果。
相对布局是在二维空间中的布局方式,不需要遵循线性布局的规则,布局方式更为自由。通过在子组件上设置锚点规则(AlignRules)使子组件能够将自己在横轴、纵轴中的位置与容器或容器内其他子组件的位置对齐。设置的锚点规则可以天然支持子元素压缩、拉伸、堆叠或形成多行效果。在页面元素分布复杂或通过线性布局会使容器嵌套层数过深时推荐使用。
栅格是多设备场景下通用的辅助定位工具,可将空间分割为有规律的栅格。内容相同但布局不同时使用。
使用列表可以高效地显示结构化、可滚动的信息。列表适合用于呈现同类数据类型或数据类型集,例如图片和文本。
网格布局具有较强的页面均分能力、子元素占比控制能力。在需要按照固定比例或者均匀分配空间的布局场景下使用,例如计算器、相册、日历等。
轮播组件通常用于实现广告轮播、图片预览等。
选项卡可以在一个页面内快速实现视图内容的切换,一方面提升查找信息的效率,另一方面精简用户单次获取到的信息量。
媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。
使用position实现绝对定位,设置元素左上角相对于父容器左上角偏移位置。在布局容器中,设置该属性不影响父容器布局,仅在绘制时进行位置调整。
对于不同尺寸的设备,使用绝对定位的适应性会比较差,在屏幕的适配上有缺陷。
使用offset可以实现相对定位,设置元素相对于自身的偏移量。设置该属性,不影响父容器布局,仅在绘制时进行位置调整。
相对定位不脱离文档流,即原位置依然保留,不影响元素本身的特性,仅相对于原位置进行偏移。
1. flexGrow基于父容器的剩余空间分配来控制组件拉伸。
2. flexShrink设置父容器的压缩尺寸来控制组件压缩。
容器组件尺寸发生变化时,增加或减小的空间全部分配给容器组件内指定区域。
aspectRatio属性指定当前组件的宽高比来控制缩放,公式为:aspectRatio=width/height。
子组件的宽高按照预设的比例,随容器组件发生变化,且变化过程中子组件的宽高比不变。
1. 将子组件的宽高设置为父组件宽高的百分比。
2. layoutWeight属性,使得子元素自适应占满剩余空间。
占比能力是指子组件的宽高按照预设的比例,随父容器组件发生变化。
通过displayPriority属性来控制组件的显示和隐藏。
隐藏能力是指容器组件内的子组件,按照其预设的显示优先级,随容器组件尺寸变化显示或隐藏,其中相同显示优先级的子组件同时显示或隐藏。
专注于满足不同设备或使用场景(如应用)的个性化需求,包括UI设计、资源和配置,以及针对特定场景的交互逻辑和功能特性。
依赖基础特性层和公共能力层来实现具体功能
产品定制层的各个子目录会被编译成一个Entry类型的HAP,作为应用的主入口。
用于存放基础特性集合,例如相对独立的功能UI和业务逻辑实现。
对于需要通过Ability承载的功能,可以设计为Feature类型的HAP,而对于不需要通过Ability承载的功能,根据是否需要实现按需加载,可以选择设计为HAR模块或者HSP模块,编译后对应HAR包或者HSP包。
用于存放公共基础能力,集中了例如公共UI组件、数据管理、外部交互以及工具库等的共享功能。
公共能力层的各子目录将被编译成HAR包,而他们只能被产品定制层和基础特性层所依赖,不允许存在反向依赖。
分层架构设计以一套代码工程为基础,旨在为华为的手机、2in1等1+8全场景设备提供支持,实现了“一次开发,多端部署”的开发理念。
ArkData (方舟数据管理)为开发者提供数据存储、数据管理和数据同步能力
通常用于保存应用的配置信息。数据通过文本的形式保存在设备中,应用使用过程中会将文本中的数据全量加载到内存中,所以访问速度快、效率高,但不适合需要存储大量数据的场景。
一种非关系型数据库,其数据以“键值”对的形式进行组织、索引和存储,其中“键”作为唯一标识符。
适合很少数据关系和业务关系的业务数据存储,同时因其在分布式场景中降低了解决数据库版本兼容问题的复杂度,和数据同步过程中冲突解决的复杂度而被广泛使用。
相比于关系型数据库,更容易做到跨设备跨版本兼容。
一种关系型数据库,以行和列的形式存储数据,广泛用于应用中的关系型数据的处理,包括一系列的增、删、改、查等接口,开发者也可以运行自己定义的SQL语句来满足复杂业务场景的需要。
创建项目
绑定包名
HarmonyOS应用/服务通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用/服务的完整性。
密钥库文件(.p12)
证书请求文件(.csr)
material文件夹(存放签名方案相关材料,如密码、证书等)
首先需要通过DevEco Studio来生成密钥(存储在格式为.p12的密钥库文件中)和证书请求文件(.csr文件)
由华为AppGallery Connect颁发。
和 .csr 绑定
选择AGC创建的应用
自动绑定包名
绑定调试证书
绑定设备
包含HarmonyOS应用/服务的包名、数字证书信息、描述应用/服务允许申请的证书权限列表,以及允许应用/服务调试的设备列表(如果应用/服务类型为Release类型,则设备列表为空)等内容,每个应用/服务包中均必须包含一个Profile文件。
在DevEco Studio中配置密钥(.p12)文件、申请的调试证书(.cer)文件和调试Profile(.p7b)文件。
添加公钥指纹 -- 选择调试证书
AppGallery Connect(简称AGC)