96SEO 2026-02-19 15:43 14
。

用户启动、使用和退出应用过程中#xff0c;应用组件会在不同的状态间切换#xff0c;这些状态称为应用组件的生命周期。
应用组件提供生命周期的回调函数…基础说明
应用组件是应用的基本组成单位是应用的运行入口。
用户启动、使用和退出应用过程中应用组件会在不同的状态间切换这些状态称为应用组件的生命周期。
应用组件提供生命周期的回调函数开发者通过应用组件的生命周期回调感知应用的状态变化。
应用开发者在编写应用时首先需要编写的就是应用组件同时还需编写应用组件的生命周期回调函数并在应用配置文件中配置相关信息。
这样操作系统在运行期间通过配置文件创建应用组件的实例并调度它的生命周期回调函数从而执行开发者的代码。
应用进程模型
应用进程模型定义应用进程的创建和销毁方式以及进程间的通信方式。
应用线程模型
应用线程模型定义应用进程内线程的创建和销毁方式、主线程和UI线程的创建方式、线程间的通信方式。
应用任务管理模型
应用任务管理模型定义任务Mission的创建和销毁方式以及任务与组件间的关系。
HarmonyOS应用任务管理由系统应用负责三方应用无需关注下文不做具体介绍。
应用配置文件
应用配置文件中包含应用配置信息、应用组件信息、权限信息、开发者自定义信息等这些信息在编译构建、分发和运行阶段分别提供给编译工具、应用市场和操作系统使用。
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/stage-model-development-overview-0000001427744552-V3
Ability模型HarmonyOS早期版本开始支持的模型已经不再主推。
Stage模型HarmonyOS
Preview版本开始新增的模型是目前主推且会长期演进的模型。
在该模型中由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”因此称这种应用模型为Stage模型。
Stage模型中多个应用组件共享同一个ArkTS引擎实例而FA模型中每个应用组件独享一个ArkTS引擎实例。
因此在Stage模型中应用组件之间可以方便的共享对象和状态同时减少复杂应用运行对内存的占用。
Stage模型作为主推的应用模型开发者通过它能够更加便利地开发出分布式场景下的复杂应用。
.1.3、Module、HAP、HAR、HSP等应用程序包的基础概念
Module是HarmonyOS应用/服务的基本功能单元包含了源代码、资源文件、第三方库及应用/服务配置文件每一个Module都可以独立进行编译和运行。
Module分为“Ability”和“Library”两种类型
Studio把应用程序编译为一个或者多个.hap后缀的文件即HAP。
HAP是HarmonyOS应用安装的基本单位包含了编译后的代码、资源、三方库及配置文件。
HAP可分为Entry和Feature两种类型。
Entry类型的HAP是应用的主模块在module.json5配置文件中的type标签配置为“entry”类型。
在同一个应用中同一设备类型只支持一个Entry类型的HAP通常用于实现应用的入口界面、入口图标、主特性功能等。
Feature类型的HAP是应用的动态特性模块在module.json5配置文件中的type标签配置为“feature”类型。
一个应用程序包可以包含一个或多个Feature类型的HAP也可以不包含Feature类型的HAP通常用于实现应用的特性功能可以配置成按需下载安装也可以配置成随Entry类型的HAP一起下载安装请参见module对象内部结构中的“deliveryWithInstall”。
2、每个HarmonyOS应用可以包含多个.hap文件一个应用中的.hap文件合在一起称为一个Bundle而bundleName就是应用的唯一标识请参见app.json5配置文件中的bundleName标签。
需要特别说明的是在应用上架到应用市场时需要把应用包含的所有.hap文件即Bundle打包为一个.app后缀的文件用于上架这个.app文件称为App
Pack属性的pack.info文件在云端服务器分发和终端设备安装时都是以HAP为单位进行分发和安装的。
3、打包后的HAP包结构包括ets、libs、resources等文件夹和resources.index、module.json、pack.info等文件。
ets用于存放库文件。
库文件是HarmonyOS应用依赖的第三方代码.so二进制文件。
resources目录用于存放应用的资源文件字符串、图片等便于开发者使用和维护详见资源分类与访问。
resources.index是资源索引表由IDE编译工程时生成。
module.json是HAP的配置文件内容由工程配置中的module.json5和app.json5组成该文件是HAP中必不可少的文件。
IDE会自动生成一部分默认配置开发者按需修改其中的配置。
详细字段请参见应用配置文件。
pack.info是Bundle中用于描述每个HAP属性的文件例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息由IDE工具生成Bundle包时自动生成。
“Library”类型的Module对应于HARHarmony
PS个人建议使用lpx配置好配置文件这里就可以按照UI设计稿实际的来可以更好的实现设计效果
名称描述px屏幕物理像素单位vp屏幕密度相关像素根据屏幕像素密度转换为屏幕物理像素当数值不带单位时默认单位vp。
在实际宽度为1440物理像素的屏幕上1vp约等于3px。
fp字体像素与vp类似适用屏幕密度变化随系统字体大小设置变化。
lpx视窗逻辑像素单位lpx单位为实际屏幕宽度与逻辑宽度通过designWidth配置的比值designWidth默认值为720。
当designWidth为720时在实际宽度为1440物理像素的屏幕上1lpx为2px大小。
number将vp单位的数值转换为以px为单位的数值px2vp(value
number将px单位的数值转换为以vp为单位的数值fp2px(value
number将fp单位的数值转换为以px为单位的数值px2fp(value
number将px单位的数值转换为以fp为单位的数值lpx2px(value
number将lpx单位的数值转换为以px为单位的数值px2lpx(value
{Text(width(220)).width(220).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12vp)}.margin(5)Column()
{Text(width(220px)).width(220px).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White)}.margin(5)Column()
{Text(width(220vp)).width(220vp).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12vp)}.margin(5)Column()
designWidth:720).width(220lpx).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12vp)}.margin(5)Column()
px).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12vp)}.margin(5)Column()
{Text(fontSize(12fp)).width(220).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12fp)}.margin(5)Column()
{Text(width(px2vp(220))).width(px2vp(220)).height(40).backgroundColor(0xF9CF93).textAlign(TextAlign.Center).fontColor(Color.White).fontSize(12fp)}.margin(5)}.width(100%)}}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-appendix-enums-0000001478061741-V3
Ability是应用所具备能力的抽象也是应用程序的重要组成部分。
一个应用可以具备多种能力即可以包含多个AbilityAbility可以分为FAFeature
Ability两种类型;在配置文件config.json中注册Ability时可以通过配置Ability元素中的“type”属性来指定Ability模板类型“type”的取值可以为“page”、“service”或“data”分别代表Page模板、Service模板、Data模板。
其实这个东西和安卓的Activity意义差不多就是提供一个和用户交互的窗口而**AbilitySlice**其实就是相当于fragment一个Page里面可以有多个AbilitySlice就是相当于一个Activity中有多个fragment都是有独立的生命周期。
setMainRoute设置默认展示AbilitySliceaddActionRoute添加其他的要展示的AbilitySlice其中router要在abilities-skills-actions下定义
相当于安卓的onCreate(),仅执行一次且是布局的初始化使用调用后进入INACTIVE状态onActive()相当于安卓的onResume(),用户重新回到该page时回调onInactive()相当于安卓的onPause(),用户离开该page时调用onBackground()相当于安卓的onSaveInstanceState(),页面进入不可见状态释放部分无用资源onForeground()相当于安卓的onRestoreInstanceState(),页面准备进入可见状态部分资源需要重新获取或者初始化onStop()和安卓的名没咋变功能也一样页面销毁时调用
1、用户通过系统管理能力关闭指定Page例如使用任务管理器关闭Page。
2、用户行为触发Page的terminateAbility()方法调用例如使用应用的退出功能。
4、系统出于资源管理目的自动触发对处于BACKGROUND状态Page的销毁。
AbilitySlice同一page内切换使用present(new
Intent())带返回的页面切换presentForResult(new
0)返回结果由导航目标AbilitySlice在其生命周期内通过setResult()进行设置接收方通过onResult()接收。
PS系统为每个Page维护了一个AbilitySlice实例的栈当开发者在调用present()或presentForResult()时指定的AbilitySlice实例已经在栈中存在时则栈中位于此实例之上的AbilitySlice均会出栈并终止其生命周期
不同Page间导航可以使用startAbility()或startAbilityForResult()方法获得返回结果的回调为onAbilityResult()。
在Ability中调用setResult()可以设置返回结
跨设备迁移需要在需要迁移的page中实现IAbilityContinuation接口
1、*onStartContinuation()*Page请求迁移后系统首先回调此方法开发者可以在此回调中决策当前是否可以执行迁移比如弹框让用户确认是否开始迁移。
2、*onSaveData()*如果onStartContinuation()返回true则系统回调此方法开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。
3、*onRestoreData()*源侧设备上Page完成保存数据后系统在目标侧设备上回调此方法开发者在此回调中接受用于恢复Page状态的数据。
注意在目标侧设备上的Page会重新启动其生命周期无论其启动模式如何配置。
且系统回调此方法的时机在onStart()之前。
4、onCompleteContinuation()*目标侧设备上恢复数据一旦完成系统就会在源侧设备上回调Page的此方法以便通知应用迁移流程已结束。
开发者可以在此检查迁移结果是否成功并在此处理迁移结束的动作例如应用可以在迁移完成后终止自身生命周期。
5、*onRemoteTerminated()*如果开发者使用continueAbilityReversibly()而不是continueAbility()则此后可以在源侧设备上使用reverseContinueAbility()进行回迁。
这种场景下相当于同一个Page的两个实例同时在两个设备上运行迁移完成后如果目标侧设备上Page因任何原因终止则源侧Page通过此回调接收终止通知。
请求迁移实现IAbilityContinuation的Page可以在其生命周期内调用continueAbility()或continueAbilityReversibly()请求迁移。
两者的区别是通过后者发起的迁移此后可以进行回迁。
请求回迁使用continueAbilityReversibly()请求迁移并完成后源侧设备上已迁移的Page可以发起回迁以便使用户活动重新回到此设备。
reverseContinueAbility()Service
基于Service模板的Ability以下简称“Service”主要用于后台运行任务如执行音乐播放、文件下载等但不提供用户交互界面。
Service可由其他应用或Ability启动即使用户切换到其他应用Service仍将在后台继续运行。
Service是单实例的。
在一个设备上相同的Service只会存在一个实例如果多个Ability共用这个实例只有当与Service绑定的所有Ability都退出后Service才能够退出由于Service是在主线程里执行的因此如果在Service里面的操作时间过长开发者必须在Service里创建新的线程来处理详见线程间通信防止造成主线程阻塞应用程序无响应
该方法在创建Service的时候调用用于Service的初始化。
在Service的整个生命周期只会调用一次调用时传入的Intent应为空。
onCommand()在Service创建完成之后调用该方法在客户端每次启动该Service时都会调用用户可以在该方法中做一些调用统计、初始化类的操作。
onConnect()在Ability和Service连接时调用该方法返回IRemoteObject对象用户可以在该回调函数中生成对应Service的IPC通信通道以便Ability与Service交互。
Ability可以多次连接同一个Service系统会缓存该Service的IPC通信对象只有第一个客户端连接Service时系统才会调用Service的onConnect方法来生成IRemoteObject对象而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端而无需再次调用onConnect方法。
onDisconnect()在Ability与绑定的Service断开连接时调用。
onStop()在Service销毁时调用。
Service应通过实现此方法来清理任何资源如关闭线程、注册的侦听器等。
启动
和普通的页面跳转逻辑一致如果Service尚未运行则系统会先调用onStart()来初始化Service再回调Service的onCommand()方法来启动Service。
如果Service正在运行则系统会直接回调Service的onCommand()方法来启动Service。
Service一旦创建就会一直保持在后台运行除非必须回收内存资源否则系统不会停止或销毁Service。
开发者可以在Service中通过terminateAbility()停止本Service或在其他Ability调用stopAbility()来停止Service。
连接回调需要传入目标Service的Intent与IAbilityConnection的实例其中intent的实现和页面跳转的intent设置基本一致。
service中的onConnect()需要返回一个IRemoteObject对象HarmonyOS提供了IRemoteObject的默认实现用户可以通过继承LocalRemoteObject来创建自定义的实现类
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-click-0000001477981153-V3
{Button(Click).width(100).height(40).onClick((event:
event.target.area.globalPosition.x
event.target.area.globalPosition.y
event.timestamp;})Button(Click).width(200).height(50).onClick((event:
event.target.area.globalPosition.x
event.target.area.globalPosition.y
event.timestamp;})}.margin(20)Text(this.text).margin(15)}.width(100%)}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-touch-0000001427902424-V3
{Button(Touch).height(40).width(100).onTouch((event:
event.target.area.globalPosition.x
event.target.area.globalPosition.y
event.target.area.height})Button(Touch).height(50).width(200).margin(20).onTouch((event:
event.target.area.globalPosition.x
event.target.area.globalPosition.y
event.target.area.height})Text(this.text)}.width(100%).padding(30)}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-show-hide-0000001428061696-V3
{Button(this.changeAppear).onClick(()
{Text(this.myText).fontSize(26).fontWeight(FontWeight.Bold).onAppear(()
{promptAction.showToast({message:
{promptAction.showToast({message:
2000})})}}.padding(30).width(100%)}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-drag-drop-0000001427584820-V3
DragItemInfo)第一次拖拽此事件绑定的组件时触发回调onDragEnter(event:
void)拖拽进入组件范围内时触发回调onDragMove(event:
void)拖拽在组件范围内移动时触发回调onDragLeave(event:
void)拖拽离开组件范围内时触发回调onDrop(event:
void)绑定此事件的组件可作为拖拽释放目标当在本组件范围内停止拖拽行为时触发回调
.1.5、按键事件(键盘操作)—onKeyEvent(event:
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-key-0000001427744780-V3
按键事件指组件与键盘、遥控器等按键设备交互时触发的事件适用于所有可获焦组件例如Button。
对于TextImage等默认不可获焦的组件可以设置focusable属性为true后使用按键事件。
{Button(KeyEvent).onKeyEvent((event:
event.keyText})Text(this.text).padding(15)}.height(300).width(100%).padding(35)}
焦点事件指页面焦点在可获焦组件间移动时触发的事件组件可使用焦点事件来处理相关逻辑。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-focus-event-0000001478181373-V3
目前仅支持通过外接键盘的tab键、方向键触发。
存在默认交互逻辑的组件例如Button、TextInput等默认即为可获焦Text、Image等组件则默认状态为不可获焦不可获焦状态下无法触发焦点事件需要设置focusable属性为true才可触发。
通过外接键盘的上下键可以让焦点在三个按钮间移动按钮获焦时颜色变化失焦时变回原背景色Button(First
Button).backgroundColor(this.oneButtonColor).width(260).height(70).fontColor(Color.Black).focusable(true).onFocus(()
Button).backgroundColor(this.twoButtonColor).width(260).height(70).fontColor(Color.Black).focusable(true).onFocus(()
Button).backgroundColor(this.threeButtonColor).width(260).height(70).fontColor(Color.Black).focusable(true).onFocus(()
#90EE90})}.width(100%).margin({
在鼠标的单个动作触发多个事件时事件的顺序是固定的鼠标事件默认透传。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-mouse-key-0000001478341101-V3
{Button(this.hoverText).width(180).height(80).backgroundColor(this.color).onHover((isHover:
通过onHover事件动态修改按钮在是否有鼠标悬浮时的文本内容与背景颜色if
Color.Blue;}})Button(onMouse).width(180).height(80).onMouse((event:
MouseButton.Right:this.mouseBtn
MouseButton.Forward:this.mouseBtn
MouseButton.Middle:this.mouseBtn
MouseAction.Release:this.action
);})Text(this.mouseText)}.padding({
.1.8、组件区域变化事件—onAreaChange(event:
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-area-change-event-0000001478061665-V3
组件区域变化事件指组件显示的尺寸、位置等发生变化时触发的事件。
{Text(this.value).backgroundColor(Color.Green).margin(30).fontSize(20).onClick(()
${JSON.stringify(newValue)})this.sizeValue
JSON.stringify(newValue)})Text(new
})}.width(100%).height(100%).margin({
}.1.9、组件可见区域变化事件—onVisibleAreaChange(ratios:
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-visible-area-change-event-0000001477981161-V3
组件可见区域变化事件是组件在屏幕中的显示区域面积变化时触发的事件提供了判断组件是否完全或部分显示在屏幕中的能力适用于广告曝光埋点之类的场景。
{Text(this.testTextStr).fontSize(20)Text(this.testRowStr).fontSize(20)}.height(100).backgroundColor(Color.Gray).opacity(0.3)Scroll(this.scroller)
Change).fontSize(20).height(200).margin({
}).backgroundColor(Color.Green)//
1.0]实现当组件完全显示或完全消失在屏幕中时触发回调.onVisibleAreaChange([0.0,
})}.height(200).backgroundColor(Color.Yellow).onVisibleAreaChange([0.0,
{Text(item.toString()).width(90%).height(150).backgroundColor(0xFFFFFF).borderRadius(15).fontSize(16).textAlign(TextAlign.Center).margin({
item)}.width(100%)}.backgroundColor(0x317aff).scrollable(ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarColor(Color.Gray).scrollBarWidth(10).onScroll((xOffset:
Stop)})}.width(100%).height(100%).backgroundColor(0xDCDCDC)}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-size-0000001428061700-V3
缺省时使用元素自身内容需要的宽度。
若子组件的宽大于父组件的宽则会画出父组件的范围。
缺省时使用元素自身内容需要的高度。
若子组件的高大于父组件的高则会画出父组件的范围。
padding设置百分比时上下左右内边距均以父容器的width作为基础值。
margin设置百分比时上下左右外边距均以父容器的width作为基础值。
.2.1.6、layoutWeight—按权重设置宽高(仅在Row/Column/Flex布局中生效)
父容器尺寸确定时设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配忽略元素本身尺寸设置表示自适应占满剩余空间。
.2.1.7、constraintSize—设置约束尺寸组件布局时进行尺寸范围限制
constraintSize的优先级高于Width和Height。
若设置的minWidth大于maxWidth则minWidth生效minHeight与maxHeight同理。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-location-0000001427584824-V3
.2.2.1、align—设置元素内容在元素绘制区域内的对齐方式
.2.2.2、direction----设置元素水平方向的布局
.2.2.3、position—绝对定位设置元素左上角相对于父容器左上角偏移位置
在布局容器中设置该属性不影响父容器布局仅在绘制时进行位置调整。
.2.2.4、markAnchor—设置元素在位置定位时的锚点以元素左上角作为基准点进行偏移
通常配合position和offset属性使用单独使用时效果类似offset
.2.2.5、offset—相对定位设置元素相对于自身的偏移量
left设置左对齐参数。
right设置右对齐参数。
middle设置横向居中对齐方式的参数。
top设置顶部对齐的参数。
bottom设置底部对齐的参数。
center设置纵向居中对齐方式的参数。
说明anchor设置作为锚点的组件的id值。
align设置相对于锚点组件的对齐方式。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-layout-constraints-0000001427744784-V3
.2.3.2、displayPriority—设置当前组件在布局容器中显示的优先级(仅在Row/Column/Flex(单行)容器组件中生效)
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-flex-layout-0000001478181377-V3
.2.4.1、flexBasis—设置组件在父容器主轴方向上的基准尺寸
默认值‘auto’表示组件在主轴方向上的基准尺寸为组件原本的大小。
.2.4.2、flexGrow—设置父容器的剩余空间分配给此属性所在组件的比例
.2.4.3、flexShrink—设置父容器压缩尺寸分配给此属性所在组件的比例
.2.4.4、alignSelf—子组件在父容器交叉轴的对齐格式会覆盖Flex布局容器中的alignItems设置
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-border-0000001478341105-V3
width设置边框宽度。
color设置边框颜色。
radius设置边框圆角半径。
style设置边框样式。
.2.5.3、borderWidth—设置元素的边框宽度不支持百分比
.2.5.5、borderRadius—设置元素的边框圆角半径不支持百分比
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-border-image-0000001478061669-V3
.2.6.1、borderImage—图片边框或者渐变色边框设置接口
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-background-0000001477981165-V3
.2.7.1、backgroundColor—设置组件的背景色
src图片地址支持网络图片资源和本地图片资源地址(不支持svg类型的图片)。
repeat设置背景图片的重复样式默认不重复。
当设置的背景图片为透明底色图片且同时设置了backgroundColor时二者叠加显示背景颜色在最底部。
.2.7.3、backgroundImageSize—背景图片大小设置
Length}对象时如果只设置一个属性则第二个属性保持图片原始宽高比进行调整。
默认保持原图的比例不变。
设置为小于0的值时按值为0显示。
当设置了height未设置width时width根据图片原始宽高比进行调整。
.2.7.4、backgroundImagePosition—设置背景图在组件中显示位置即相对于组件左上角的坐标
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-opacity-0000001427902432-V3
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-visibility-0000001428061704-V3
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-enable-0000001427584828-V3
组件是否可交互可交互状态下响应点击事件、触摸事件、拖拽事件、按键事件、焦点事件和鼠标事件。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-overlay-0000001427744788-V3
文本定位align设置文本相对于组件的方位offset为文本基于自身左上角的偏移量。
文本默认处于组件左上角。
两者都设置时效果重叠文本相对于组件方位定位后再基于当前位置文本的左上角进行偏移。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-z-order-0000001478181381-V3
zIndex值越大显示层级越高即zIndex值大的组件会覆盖在zIndex值小的组件上方
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-transformation-0000001478341109-V3
.2.13.1、rotate—可使组件在以组件左上角为坐标原点的坐标系中进行旋转坐标系如下图所示
angle旋转角度。
取值为正时相对于旋转轴方向顺时针转动取值为负时相对于旋转轴方向逆时针转动。
取值可为string类型如’90deg’。
centerX和centerY用于指定旋转的中心点。
旋转轴和旋转中心点都基于坐标系设定组件发生位移时坐标系不会随之移动。
.2.13.2、translate—可使组件在以组件左上角为坐标原点的坐标系中进行移动坐标系如下图所示
其中xyz的值分别表示在对应轴移动的距离值为正时表示向对应轴的正向移动值为负时表示向对应轴的反向移动。
移动距离支持数字和字符串比如’10px’‘10%’两种类型。
.2.13.3、scale—可以分别设置X轴、Y轴、Z轴的缩放比例
默认值为1同时可以通过centerX和centerY设置缩放的中心点。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-image-effect-0000001478061673-V3
.2.14.1、blur—为当前组件添加内容模糊效果入参为模糊半径模糊半径越大越模糊为0时不模糊
.2.14.2、backdropBlur—为当前组件添加背景模糊效果入参为模糊半径模糊半径越大越模糊为0时不模糊
入参为模糊半径(必填)、阴影的颜色(可选默认为灰色)、X轴的偏移量(可选默认为0)Y轴的偏移量(可选默认为0)偏移量单位为px
值定义为灰度转换的比例入参1.0则完全转为灰度图像入参则0.0图像无变化入参在0.0和1.0之间时效果呈线性变化。
百分比)
入参为高光比例值为1时没有效果小于1时亮度变暗0为全黑大于1时亮度增加数值越大亮度越大。
饱和度为颜色中的含色成分和消色成分(灰)的比例入参为1时显示原图像大于1时含色成分越大饱和度越大小于1时消色成分越大饱和度越小。
百分比
入参为对比度的值。
值为1时显示原图大于1时值越大对比度越高图像越清晰醒目小于1时值越小对比度越低当对比度为0时图像变为全灰。
百分比
入参为图像反转的比例值为1时完全反转值为0则图像无变化。
百分比
入参为图像反转的比例。
值为1则完全是深褐色的值为0图像无变化。
.2.14.10、hueRotate—色相旋转效果输入参数为旋转角度
度然后再旋转-180度会显示原始颜色。
数据类型为number时值为90和’90deg’效果一致。
.2.14.11、colorBlend—为当前组件添加颜色叠加效果入参为叠加的颜色
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-sharp-clipping-0000001477981173-V3
.2.15.1、clip—参数为相应类型的组件按指定的形状对当前组件进行裁剪参数为boolean类型时设置是否按照父容器边缘轮廓进行裁剪
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-text-style-0000001427902436-V3
Length为number类型时使用fp单位。
字体默认大小16。
不支持设置百分比字符串。
900]取值间隔为100默认为400取值越大字体越粗。
string类型仅支持number类型取值的字符串形式例如400以及bold、“bolder”、“lighter”、“regular”、“medium”分别对应FontWeight中相应的枚举值。
设置值不大于0时不限制文本行高自适应字体大小Length为number类型时单位为fp。
.2.16.7、decoration—设置文本装饰线样式及其颜色
TextDecorationType.None,colorColor.Black}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-grid-0000001428061712-V3
栅格布局的列宽、列间距由距离最近的GridContainer父组件决定。
使用栅格属性的组件树上至少需要有1个GridContainer容器组件。
指useSizeType属性没有设置对应尺寸的列数span)时占用的栅格列数。
指useSizeType属性没有设置对应尺寸的偏移(offset)时
当前组件沿着父组件Start方向偏移的列数也就是当前组件位于第n列。
配置该属性后当前组件在父组件水平方向的布局不再跟随父组件原有的布局方式而是沿着父组件的Start方向偏移一定位移。
偏移位移
列数。
设置了偏移(gridOffset)的组件之后的兄弟组件会根据该组件进行相对布局类似相对布局。
单独设置gridSpan和gridOffset在特定屏幕大小下的效果与useSizeType效果一致
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-gradient-color-0000001427584832-V3
线性渐变的起始角度。
0点方向顺时针旋转为正向角度。
默认值180direction:
线性渐变的方向设置angle后不生效。
默认值GradientDirection.Bottomcolors:
center为角度渐变的中心点即相对于当前组件左上角的坐标。
start角度渐变的起点。
默认值0end角度渐变的终点。
默认值0rotation:
设置为小于0的值时按值为0处理。
设置为大于360的值时按值为360处理。
当start、end、rotation的数据类型为string值为90或90%与90效果一致。
center径向渐变的中心点即相对于当前组件左上角的坐标。
radius径向渐变的半径。
取值范围
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-popup-0000001427744792-V3
.2.19.1、bindPopup—给组件绑定Popup弹窗设置参数show为true弹出弹框
弹窗显示状态默认值为false隐藏弹窗。
popup弹窗必须等待页面全部构建完成才能展示因此show不能在页面构建中设置为true否则会导致popup弹窗显示位置及形状错误。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-menu-0000001478181385-V3
为组件绑定弹出式菜单弹出式菜单以垂直列表形式显示菜单项可通过长按、点击或鼠标右键触发。
.2.20.1、bindMenu—给组件绑定菜单点击后弹出菜单
.2.20.2、bindContextMenu—给组件绑定菜单触发方式为长按或者右键点击弹出菜单项需要自定义
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-focus-0000001478061677-V3
自定义组件的走焦效果可设置组件是否走焦和具体的走焦顺序tab键或者方向键切换焦点。
存在默认交互逻辑的组件例如Button、TextInput等默认即为可获焦Text、Image等组件则默认状态为不可获焦。
不可获焦状态下无法触发焦点事件。
若有配置了tabIndex大于0的组件则tab键走焦只会在tabIndex大于0的组件内按照tabIndex的值从小到大并循环依次走焦。
若没有配置tabIndex大于0的组件则tabIndex等于0的组件按照组件预设的走焦规则走焦。
0表示元素是可聚焦的并且可以通过tab键走焦来访问到该元素。
tabIndex
-1表示元素是可聚焦的但是不能通过tab键走焦来访问到该元素。
.2.21.3、defaultFocus—设置当前组件是否为当前页面上的默认焦点仅在初次创建的页面第一次进入时生效
.2.21.4、groupDefaultFocus—设置当前组件是否为当前组件所在容器获焦时的默认焦点仅在初次创建容器节点第一次获焦时生效
必须与tabIndex联合使用当某个容器设置了tabIndex且容器内某子组件设置了groupDefaultFocus当该容器首次获焦时会自动将焦点转移至该组件上。
.2.21.5、focusOnTouch—设置当前组件是否支持点击获焦能力
首次按下TAB键焦点切换到defaultFocus绑定的组件上
第二次按TAB键焦点切换到tabIndex(1)的容器上且自动走到其内部的groupDefaultFocus绑定的组件上
第三次按TAB键焦点切换到tabIndex(2)的容器上且自动走到其内部的groupDefaultFocus绑定的组件上
第四次按TAB键焦点切换到tabIndex(3)的容器上且自动走到其内部的groupDefaultFocus绑定的组件上
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-hover-effect-0000001477981177-V3
.2.22.1、hoverEffect—设置当前组件悬停态下的悬浮效果
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-component-id-0000001427902440-V3
id为组件的唯一标识在整个应用内唯一。
本模块提供组件标识相关接口可以获取指定id组件的属性也提供向指定id组件发送事件的功能。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-touch-target-0000001428061716-V3
.2.24.1、responseRegion—设置一个或多个触摸热区包括位置和大小
默认触摸热区为整个组件默认值{x0,y0,width‘100%’,height‘100%’}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-polymorphic-style-0000001427584836-V3
.2.25.1、stateStyles—设置组件不同状态的样式
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-hit-test-behavior-0000001427744800-V3
设置组件的触摸测试类型。
ArkUI开发框架在处理触屏事件时会在触屏事件触发前进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件然后基于触摸测试结果分发相应的触屏事件。
hitTestBehavior属性可以设置不同的触摸测试响应模式影响组件的触摸测试收集结果最终影响后续的触屏事件分发具体影响参考HitTestMode枚举说明。
当Stack组件中有多个节点触摸区域重叠时如两个节点默认只会对显示在最上层的节点做触摸测试若需要显示在下层的节点触发触摸测试请给显示在上层的节点设置hitTestBehavior为HitTestMode.Transparent。
.2.26.1、hitTestBehavior—设置当前组件的触摸测试类型
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-restoreid-0000001478341121-V3
组件的分布式迁移标识指明了该组件在分布式迁移场景下可以将特定状态恢复到对端设备。
.2.27.1、restoreId—标记支持分布式迁移的组件Id用于两端设备组件的配对
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-click-0000001478341113-V3
.2.28.1、touchable—设置当前组件是否可以响应点击事件、触摸事件等手指交互事件。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-gesture-settings-0000001477981181-V3
.3.1.2、priorityGesture—绑定优先识别手势
1、默认情况下子组件优先识别通过gesture绑定的手势当父组件配置priorityGesture时父组件优先识别priorityGesture绑定的手势。
2、长按手势时设置触发长按的最短时间小的组件会优先响应会忽略priorityGesture设置。
.3.1.3、parallelGesture—绑定可与子组件手势同时触发的手势
手势事件为非冒泡事件。
父组件设置parallelGesture时父子组件相同的手势事件都可以触发实现类似冒泡效果。
若父子组件中同时绑定单击手势事件和双击手势事件则只响应单击手势事件。
this.priorityTestValue).fontSize(28).gesture(TapGesture().onAction(()
\nText}))}.height(200).width(250).padding(20).margin(20).border({
设置为priorityGesture时点击文本会忽略Text组件的TapGesture手势事件优先识别父组件Column的TapGesture手势事件.priorityGesture(TapGesture().onAction((event:
GestureMask.IgnoreInternal)Column()
this.parallelTestValue).fontSize(28).gesture(TapGesture().onAction(()
\nText}))}.height(200).width(250).padding(20).margin(20).border({
设置为parallelGesture时点击文本会同时触发子组件Text与父组件Column的TapGesture手势事件.parallelGesture(TapGesture().onAction((event:
.3.2.1、TapGesture—支持单击、双击和多次点击事件的识别。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-tapgesture-0000001428061720-V3
twice).fontSize(28).gesture(TapGesture({
JSON.stringify(event.fingerList[0])})).3.2.2、LongPressGesture—用于触发长按手势事件触发长按手势的最少手指数为1最短长按时间为500毫秒
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-longpressgesture-0000001427584844-V3
单指长按文本触发该手势事件.gesture(LongPressGesture({
由于repeat设置为true长按动作存在时会连续触发触发间隔为duration默认值500ms.onAction((event:
0})).3.2.3、PanGesture—用于触发拖动手势事件滑动的最小距离为5vp时拖动手势识别成功
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-pangesture-0000001427744804-V3
this.offsetY)}.height(200).width(300).padding(20).border({
左右拖动触发该手势事件.gesture(PanGesture(this.panOption).onActionStart((event:
start)}).onActionUpdate((event:
.3.2.4、PinchGesture—用于触发捏合手势触发捏合手势的最少手指为2指最大为5指最小识别距离为5vp
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-pinchgesture-0000001478181393-V3
this.scaleValue)Text(PinchGesture
))}.height(200).width(300).padding(20).border({
三指捏合触发该手势事件.gesture(PinchGesture({
start)}).onActionUpdate((event:
event.pinchCenterY}).onActionEnd(()
this.scaleValueconsole.info(Pinch
end)})).3.2.5、RotationGesture—用于触发旋转手势事件触发旋转手势的最少手指为2指最大为5指最小改变度数为1度
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-rotationgesture-0000001478341125-V3
this.angle)}.height(200).width(300).padding(20).border({
双指旋转触发该手势事件.gesture(RotationGesture().onActionStart((event:
start)}).onActionUpdate((event:
this.angleconsole.info(Rotation
end)})).3.2.6、SwipeGesture—用于触发滑动事件滑动速度大于100vp/s时可识别成功
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-swipegesture-0000001478061685-V3
}).width(300).height(200).margin(100).rotate({
单指竖直方向滑动时触发该事件.gesture(SwipeGesture({
event.angle})).3.3、组合手势—手势识别组合即多种手势组合为复合手势支持连续识别、并行识别和互斥识别
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-combined-gestures-0000001477981185-V3
以下组合手势为顺序识别当长按手势事件未正常触发时则不会触发拖动手势事件
GestureGroup(GestureMode.Sequence,
{this.count}console.info(LongPress
BorderStyle.Dashedconsole.info(pan
start)}).onActionUpdate((event:
BorderStyle.Solidconsole.info(pan
按顺序首先触发长按事件长按事件识别结束之后其次触发拖动事件向右下方拖动
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-custom-component-lifecycle-0000001482395076-V3
自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期这些回调函数是私有的在运行时由开发框架在特定的时间进行调用不能从应用程序中手动调用这些回调函数。
voidaboutToAppear函数在创建自定义组件的新实例后在执行其build()函数之前执行。
允许在aboutToAppear函数中改变状态变量更改将在后续执行build()函数中生效。
aboutToDisappear?():
voidaboutToDisappear函数在自定义组件析构销毁之前执行。
不允许在aboutToDisappear函数中改变状态变量特别是Link变量的修改可能会导致应用程序行为不稳定。
onPageShow?():
void页面每次显示时触发一次包括路由过程、应用进入前台等场景仅Entry装饰的自定义组件生效。
onPageHide?():
void页面每次隐藏时触发一次包括路由过程、应用进入后台等场景仅Entry装饰的自定义组件生效。
onBackPress?():
void当用户点击返回按钮时触发仅Entry装饰的自定义组件生效。
onLayout?(children:
void框架会在自定义组件布局时将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。
不允许在onLayout函数中改变状态变量。
onMeasure?(children:
void框架会在自定义组件确定尺寸时将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。
不允许在onMeasure函数中改变状态变量。
生命周期内部相关实例
LayoutInfo子组件layout信息部分情况的周期执行流程
Child”if绑定的this.showChild变成false删除Child组件会执行Child
page”调用router.pushUrl接口跳转到另外一个页面当前Index页面隐藏执行页面生命周期Index
onPageHide。
此处调用的是router.pushUrl接口Index页面被隐藏并没有销毁所以只调用onPageHide。
跳转到新页面后执行初始化新页面的生命周期的流程。
如果调用的是router.replaceUrl则当前Index页面被销毁执行的生命周期流程将变为Index
aboutToDisappear。
上文已经提到组件的销毁是从组件树上直接摘下子树所以先调用父组件的aboutToDisappear再调用子组件的aboutToDisappear然后执行初始化新页面的生命周期流程。
点击返回按钮触发页面生命周期Index
onBackPress且触发返回一个页面后会导致当前Index页面被销毁。
最小化应用或者应用进入后台触发Index
onPageHide。
当前Index页面没有被销毁所以并不会执行组件的aboutToDisappear。
应用回到前台执行Index
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-state-management-0000001504151156-V3
双向数据绑定—Link(‘PropA’)------(能从AppStorage取/设置)
与AppStorage中对应的propName建立双向数据绑定。
如果给定的propName在AppStorage中存在返回与AppStorage中propName对应属性的双向绑定数据。
双向绑定数据的修改会同步回AppStorage中AppStorage会将变化同步到所有绑定该propName的数据和自定义组件中。
如果AppStorage中不存在propName则返回undefined。
例如AppStorage.SetOrCreate(‘PropA’,
49)------(AppStorage存在返回不存在使用默认值设置)
与Link接口类似如果给定的propName在AppStorage中存在则返回该propName对应的属性的双向绑定数据。
如果不存在则使用defaultValue在AppStorage创建和初始化propName返回其双向绑定数据。
例如AppStorage.SetOrCreate(PropA,
SubscribedAbstractPropertynumber
SubscribedAbstractPropertynumber
47取单向数据绑定—Prop(‘PropA’)------(只能从AppStorage取不能设置)
与AppStorage中对应的propName建立单向属性绑定。
如果给定的propName在AppStorage中存在则返回与AppStorage中propName对应属性的单向绑定数据。
如果AppStorage中不存在propName则返回undefined。
单向绑定数据的修改不会被同步回AppStorage中。
例如AppStorage.SetOrCreate(PropA,
AppStorage.Prop(PropA);prop1.set(1);
49)------(只能从AppStorage取有值返回无值使用默认值设置并返回)
与Prop接口类似。
如果给定的propName在AppStorage存在则返回该propName对应的属性的单向绑定数据。
如果不存在则使用defaultValue在AppStorage创建和初始化propName对应的属性返回其单向绑定数据。
例如AppStorage.SetOrCreate(PropA,
SubscribedAbstractPropertynumber
49是否存在key判断—Has(‘simpleProp’)------(AppStorage是否存在key)
判断propName对应的属性是否在AppStorage中存在。
例如AppStorage.Has(simpleProp);取值—Get(‘PropA’)—(AppStorage存在返回不存在返回undefined)
获取propName在AppStorage中对应的属性。
如果不存在返回undefined。
例如AppStorage.SetOrCreate(PropA,
------(AppStorage存在key切非空成功反之false)
在AppStorage中设置propName对应属性的值。
如果newValue的值和propName对应属性的值相同即不需要做赋值操作状态变量不会通知UI刷新propName对应属性的值。
例如AppStorage.SetOrCreate(PropA,
false设置/创建值—SetOrCreate(‘simpleProp’,
121)------(AppStorage存在则设置不存在则创建值)
如果propName已经在AppStorage中存在并且newValue和propName对应属性的值不同则设置propName对应属性的值为newValue否则状态变量不会通知UI刷新propName对应属性的值。
如果propName不存在则创建propName属性值为newValue。
setOrCreate只可以创建单个AppStorage的键值对如果想创建多个AppStorage键值对可以多次调用此方法。
例如AppStorage.SetOrCreate(simpleProp,
121);删除值—Delete(‘PropB’)------(未被绑定的可以反之不可以)
在AppStorage中删除该属性的前提是必须保证该属性没有订阅者。
如果有订阅者则返回false。
删除成功返回true。
属性的订阅者为Link、Prop等接口绑定的propName以及StorageLink(‘propName’)和StorageProp(‘propName’)。
这就意味着如果自定义组件中使用StorageLink(‘propName’)和StorageProp(‘propName’)或者SubscribedAbstractProperty实例依旧对propName有同步关系则该属性不能从AppStorage中删除。
例如AppStorage.SetOrCreate(PropA,
subscriberAppStorage.SetOrCreate(PropB,
successfullykey参数列表—Keys()------(获取所有的属性名)
例如AppStorage.SetOrCreate(PropB,
AppStorage.Keys()删除所有属性—clear()
清除AppStorage的所有的属性。
在AppStorage中清除所有属性的前提是已经没有任何订阅者。
如果有则什么都不做返回false删除成功返回true。
例如AppStorage.SetOrCreate(PropA,
subscribers属性是否是可变—IsMutable(‘simpleProp’)
返回AppStorage中propName对应的属性是否是可变的。
例如AppStorage.SetOrCreate(PropA,
AppStorage.IsMutable(simpleProp);属性数量—Size()
例如AppStorage.SetOrCreate(PropB,
函数列表基本上同AppStorage会少几个函数当时参数值以及定义基本一致唯一不同的就是相对应的数据的作用域不同。
SubscribedAbstractPropertyAppStorage/LocalStorage部分函数返回值对象
读取从AppStorage/LocalStorage同步属性的数据。
例如AppStorage.SetOrCreate(PropA,
设置AppStorage/LocalStorage同步属性的数据。
例如AppStorage.SetOrCreate(PropA,
AppStorage.Prop(PropA);prop1.set(1);
prop1.get()1PersistentStorage数据持久化存储
使参数持久化存储—PersistProp(‘highScore’,
将AppStorage中key对应的属性持久化到文件中。
该接口的调用通常在访问AppStorage之前AppStorage先PersistProp后的话可能会导致持久化存储的值被覆盖掉。
作用其实就是从持久化存储中取出上一次存储的值同时设置到AppStorage中持久化中没有的话会从AppStorage将值持久化AppStorage也没有的话会使用默认值初始化两个位置
如果PersistentStorage文件中存在key对应的属性在AppStorage中创建对应的propName并用在PersistentStorage中找到的key的属性初始化如果PersistentStorage文件中没有查询到key对应的属性则在AppStorage中查找key对应的属性。
如果找到key对应的属性则将该属性持久化如果AppStorage也没查找到key对应的属性则在AppStorage中创建key对应的属性。
用defaultValue初始化其值并将该属性持久化。
根据上述的初始化流程如果AppStorage中有该属性则会使用其值覆盖掉PersistentStorage文件中的值。
由于AppStorage是内存内数据该行为会导致数据丧失持久化能力。
示例请参考在PersistentStorage之前访问AppStorage中的属性。
AppStorage的属性向PersistentStorage中持久化的允许的类型是
例如PersistentStorage.PersistProp(highScore,
0);删除指定参数持久化存储—DeleteProp(‘highScore’)
PersistProp的逆向操作。
将key对应的属性从PersistentStorage删除后续AppStorage的操作对PersistentStorage不会再有影响。
例如PersistentStorage.DeleteProp(highScore);多条数据持久化存储—PersistProps([{},{}])
行为和PersistProp类似不同在于可以一次性持久化多个数据适合在应用启动的时候初始化。
例如PersistentStorage.PersistProps([{
PersistentStorage.Keys();Environment设备环境信息
将Environment的内置环境变量key存入AppStorage中—EnvProp(‘accessibilityEnabled’,
将Environment的内置环境变量key存入AppStorage中。
如果系统中未查询到Environment环境变量key的值则使用默认值value存入成功返回true。
如果AppStorage已经有对应的key则返回false。
在没有调用EnvProp就使用AppStorage读取环境变量是错误的。
例如Environment.EnvProp(‘accessibilityEnabled’,
key类型说明accessibilityEnabledstring无障碍屏幕朗读是否启用colorModeColorMode深浅色模式可选值为-
ColorMode.DARK深色模式。
fontScalenumber字体大小比例fontWeightScalenumber字重比例layoutDirectionLayoutDirection布局方向类型可选值为-
LayoutDirection.RTL从右到左。
languageCodestring当前系统语言小写字母例如zh
将内置环境变量组存到AppStorage中—EnvProps([{},{}])
和EnvProp类似不同点在于参数为数组可以一次性初始化多个数据。
建议在应用启动时调用将系统环境变量批量存入AppStorage中。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback