当前位置: 首页 > news >正文

鸿蒙Next ArkTS卡片生命周期:深入理解与管理实践

掌握卡片从创建到销毁的完整过程,构建高效稳定的鸿蒙应用

ArkTS卡片作为鸿蒙生态中重要的界面展示形式,能够将应用的重要信息或操作前置到卡片,实现服务直达、减少体验层级的目标。深入了解ArkTS卡片的生命周期,对于开发高性能、高可用的鸿蒙应用至关重要。本文将全面解析鸿蒙Next ArkTS卡片的生命周期管理机制。

一、ArkTS卡片概述

在鸿蒙系统中,ArkTS卡片是基于声明式开发范式开发的服务卡片,与传统JS卡片相比具有显著优势。ArkTS卡片支持动态效果自定义绘制能力逻辑代码执行,提供了更丰富和灵活的交互体验。

ArkTS卡片的运行机制涉及三个核心角色:卡片使用方(显示卡片内容的宿主应用)、卡片提供方(提供卡片显示内容的应用)和卡片管理服务(管理系统中所添加卡片的常驻代理服务)。了解这些角色之间的交互关系,是理解卡片生命周期的基础。

二、ArkTS卡片生命周期回调函数

ArkTS卡片的生命周期通过FormExtensionAbility类进行管理,开发者需要实现一系列生命周期回调函数。以下是主要的核心生命周期方法:

1. onAddForm - 卡片创建

typescript

onAddForm(want) {console.info('[EntryFormAbility] onAddForm');// 在入参want中可以取出卡片的唯一标识:formIdlet formId: string = want.parameters[formInfo.FormParam.IDENTITY_KEY];// 使用方创建卡片时触发,提供方需要返回卡片数据绑定类let obj = {"title": "titleOnCreate","detail": "detailOnCreate"};let formData = formBindingData.createFormBindingData(obj);return formData;
}

onAddForm 是卡片提供方接收创建卡片通知的接口。当使用方请求创建卡片时,系统会调用此方法。在此方法中,我们可以从want参数中获取卡片的唯一标识formId,并返回初始化的卡片数据。

2. onCastToNormalForm - 临时卡片转常态

typescript

onCastToNormalForm(formId) {// 使用方将临时卡片转换为常态卡片触发,提供方需要做相应的处理console.info(`[EntryFormAbility] onCastToNormalForm, formId: ${formId}`);
}

当用户将临时卡片转换为常态卡片时,系统会调用此方法。开发者可以在此方法中执行相应的数据处理逻辑。

3. onUpdateForm - 卡片更新

typescript

onUpdateForm(formId) {// 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能,则提供方需要重写该方法以支持数据更新console.info('[EntryFormAbility] onUpdateForm');let obj = {"title": "titleOnUpdate","detail": "detailOnUpdate"};let formData = formBindingData.createFormBindingData(obj);formProvider.updateForm(formId, formData).catch((err) => {if (err) {console.error(`[EntryFormAbility] Failed to updateForm. Code: ${err.code}, message: ${err.message}`);return;}});
}

onUpdateForm 是卡片提供方接收更新卡片通知的接口。当卡片需要更新内容时(如定时刷新、定点刷新或使用方主动请求更新),系统会调用此方法。

4. onChangeFormVisibility - 可见性变更

typescript

onChangeFormVisibility(newStatus) {// 需要配置formVisibleNotify为true,且为系统应用才会回调console.info('[EntryFormAbility] onChangeFormVisibility');
}

当卡片的可见状态发生变化时,系统会调用此方法。需要注意的是,此回调需要配置formVisibleNotify为true,且仅对系统应用生效。

5. onFormEvent - 卡片事件处理

typescript

onFormEvent(formId, message) {// 若卡片支持触发事件,则需要重写该方法并实现对事件的触发console.info('[EntryFormAbility] onFormEvent');
}

当卡片内部触发事件时,系统会调用此方法。开发者可以在此方法中处理卡片的各种交互事件。

6. onRemoveForm - 卡片销毁

typescript

onRemoveForm(formId) {// 当对应的卡片删除时触发的回调,入参是被删除的卡片IDconsole.info('[EntryFormAbility] onRemoveForm');
}

当卡片被销毁时,系统会调用此方法。开发者可以在此方法中执行资源清理等操作。

7. onConfigurationUpdate - 配置更新

typescript

onConfigurationUpdate(config) {// 当系统配置信息更新时触发的回调console.info('[EntryFormAbility] configurationUpdate:' + JSON.stringify(config));
}

当系统配置信息(如语言、屏幕方向等)发生变化时,系统会调用此方法。

8. onAcquireFormState - 卡片状态查询

typescript

onAcquireFormState(want) {// 卡片提供方接收查询卡片状态通知接口,默认返回卡片初始状态。return formInfo.FormState.READY;
}

此方法用于返回卡片的状态信息。

三、卡片刷新机制

ArkTS卡片提供了三种刷新机制,确保卡片内容能够及时更新:

1. 定时刷新

通过在form_config.json中配置updateDuration字段,可以设置卡片的定时刷新策略。例如,设置每30分钟刷新一次:

json

{"forms": [{"name": "widget","description": "This is a service widget.","src": "./ets/widget/pages/WidgetCard.ets","uiSyntax": "arkts","window": {"designWidth": 720,"autoDesignWidth": true},"colorMode": "auto","isDefault": true,"updateEnabled": true,"scheduledUpdateTime": "10:30","updateDuration": 1,"defaultDimension": "2*2","supportDimensions": ["2*2"]}]
}

注意事项

  • 定时刷新有配额限制,每张卡片每天最多通过定时方式触发刷新50次

  • 刷新次数会在每天的0点重置

  • 定时刷新使用同一个计时器进行计时,因此卡片定时刷新的第一次刷新会有最多30分钟的偏差

  • 定时刷新和定点刷新仅在屏幕亮屏情况下才会触发,在灭屏场景下仅会记录刷新动作,待亮屏时统一进行刷新

2. 定点刷新

通过在form_config.json中配置scheduledUpdateTime字段,可以设置卡片在每天的特定时间点刷新:

json

{"forms": [{// 其他配置项..."updateEnabled": true,"scheduledUpdateTime": "10:30","updateDuration": 0,// 其他配置项...}]
}

需要注意的是,updateDuration参数优先级高于scheduledUpdateTime,两者同时配置时,以updateDuration配置的刷新时间为准。

3. 下次刷新

通过setFormNextRefreshTime接口可以指定卡片的下一次刷新时间(最短时间5分钟):

typescript

import formProvider from '@ohos.app.form.formProvider';let formId = '123456789'; // 实际业务场景需要使用正确的formId
try {// 设置过5分钟后更新卡片内容formProvider.setFormNextRefreshTime(formId, 5, (err, data) => {if (err) {console.error(`Failed to setFormNextRefreshTime. Code: ${err.code}, message: ${err.message}`);return;} else {console.info('Succeeded in setFormNextRefreshTimeing.');}});
} catch (err) {console.error(`Failed to setFormNextRefreshTime. Code: ${err.code}, message: ${err.message}`);
}

四、自定义组件的生命周期

除了FormExtensionAbility的生命周期回调外,ArkTS卡片中的自定义组件也有自己的生命周期函数:

1. aboutToAppear

typescript

aboutToAppear?(): void

aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。

从API version 9开始,该接口支持在ArkTS卡片中使用。

2. aboutToDisappear

typescript

aboutToDisappear?(): void

aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

从API version 9开始,该接口支持在ArkTS卡片中使用。

3. onPageShow 和 onPageHide

typescript

onPageShow?(): void
onPageHide?(): void

页面每次显示/隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry装饰的自定义组件生效。

五、生命周期实践建议

在实际开发中,合理管理卡片生命周期至关重要。以下是一些实践建议:

  1. 资源管理:在onRemoveForm中释放卡片占用的资源,避免内存泄漏

  2. 性能优化:避免在生命周期回调中执行耗时操作,必要时使用异步处理

  3. 状态恢复:在onAddFormonUpdateForm中正确处理卡片状态的保存和恢复

  4. 错误处理:在每个生命周期回调中添加适当的错误处理机制

  5. 功耗考虑:合理设置刷新策略,平衡数据实时性和系统功耗

重要注意事项
FormExtensionAbility进程不能常驻后台,即在卡片生命周期回调函数中无法处理长时间的任务,在生命周期调度完成后会继续存在5秒,如5秒内没有新的生命周期回调触发则进程自动退出。针对可能需要5秒以上才能完成的业务逻辑,建议拉起主应用进行处理,处理完成后使用updateForm()通知卡片进行刷新。

六、完整生命周期流程图

下图展示了ArkTS卡片的完整生命周期流程:

text

创建阶段:onAddForm → aboutToAppear → build()
运行阶段:onFormEvent → onUpdateForm → onChangeFormVisibility
转换阶段:onCastToNormalForm
销毁阶段:aboutToDisappear → onRemoveForm

结语

深入理解和正确管理ArkTS卡片的生命周期,是开发高质量鸿蒙应用的关键。通过合理利用各种生命周期回调和刷新机制,开发者可以创建出响应迅速、性能高效、用户体验良好的卡片应用。

ArkTS卡片作为鸿蒙系统的重要组成部分,随着系统的不断演进,其生命周期管理机制也会不断完善和增强。建议开发者持续关注鸿蒙官方文档和API更新,及时了解最新特性和最佳实践。

http://www.dtcms.com/a/392506.html

相关文章:

  • 荣耀手机(安卓)快速传数据换机到iPhone17 Pro
  • Linux的线程池
  • [bitcoin白皮书_1] 时间戳服务器 | 简化支付验证
  • OAuth 认证在电商 API 中的实现与安全
  • Linux 是什么?初学者速查表
  • openharmony之AV_CodeC音视频编解码模块驱动实现原理详解(三)
  • Llamaindex-Llama_indexRAG进阶_Embedding_model与ChromaDB-文档切分与重排序
  • 如何使用WordToCard自动拆分文章制作小红书卡片
  • RTX 4090重塑数字内容创作:4K视频剪辑与3D渲染的效率革命
  • Spring AI开发指导-MCP
  • C++/操作系统
  • 动手学深度学习(pytorch版):第八章节—循环神经网络(4)循环神经网络
  • Jenkins与Arbess,CICD工具一文全面对比分析
  • 矩阵、线性代数
  • react常用的hooks
  • 重构的艺术:从‘屎山’恐惧到优雅掌控的理性之旅
  • 在c++中,怎么理解把析构函数设置为virtual呢?
  • CUDA性能优化 ---- 通过矢量化内存访问提高性能
  • 【序列晋升】39 Spring Data REST 的优雅实践,让数据交互更符合 REST 规范
  • 能当关系型数据库还能玩对象特性,能拆复杂查询还能自动管库存,PostgreSQL 凭什么这么香?
  • 【2025PolarCTF秋季个人赛】WEB方向wp
  • Go基础:Go语言函数和方法详解
  • Redis 遍历指定格式的所有key
  • 插入mathtype/latex公式在word中行间距变高了
  • 设计模式学习(四)代理模式、适配器模式
  • ​​[硬件电路-279]:DRV8818PWP功能概述、管脚定义
  • 【51单片机】【protues仿真】基于51单片机恒温箱系统
  • zk管理kafka有哪些不足
  • Java 大视界 -- Java 大数据机器学习模型在金融衍生品复杂风险建模与评估中的应用
  • 半导体制造中常见工艺之LPCVD