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

鸿蒙卡片服务开发

首先先创建一个项目

在该项目下创建一个卡片服务

在module.json5文件下配置

{"module": {..."extensionAbilities": [{"name": "EntryFormAbility","srcEntry": "./ets/entryformability/EntryFormAbility.ets","label": "$string:EntryFormAbility_label","description": "$string:EntryFormAbility_desc","type": "form","metadata": [{"name": "ohos.extension.form","resource": "$profile:form_config"}]}]}
}

卡片的配置文件form_config.json

​
{"forms": [{"name": "widget","displayName": "$string:widget_display_name","description": "$string:widget_desc","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"],"formConfigAbility": "ability://EntryAbility","dataProxyEnabled": false,"isDynamic": true,"transparencyEnabled": false,"metadata": []}]
}​

卡片的生命周期

const TAG: string = 'EntryFormAbility';
const DOMAIN_NUMBER: number = 0xFF00;export default class EntryFormAbility extends FormExtensionAbility {onAddForm(want: Want): formBindingData.FormBindingData {hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onAddForm');// ...// 使用方创建卡片时触发,提供方需要返回卡片数据绑定类let obj: Record<string, string> = {'title': 'titleOnAddForm','detail': 'detailOnAddForm'};let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);return formData;}onCastToNormalForm(formId: string): void {// 使用方将临时卡片转换为常态卡片触发,提供方需要做相应的处理hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onCastToNormalForm');}onUpdateForm(formId: string): void {// 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能,则提供方需要重写该方法以支持数据更新hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onUpdateForm');let obj: Record<string, string> = {'title': 'titleOnUpdateForm','detail': 'detailOnUpdateForm'};let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);formProvider.updateForm(formId, formData).catch((error: BusinessError) => {hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] updateForm, error:' + JSON.stringify(error));});}onChangeFormVisibility(newStatus: Record<string, number>): void {// 使用方发起可见或者不可见通知触发,提供方需要做相应的处理,仅系统应用生效hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onChangeFormVisibility');}onFormEvent(formId: string, message: string): void {// 若卡片支持触发事件,则需要重写该方法并实现对事件的触发hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onFormEvent');// ...}onRemoveForm(formId: string): void {// 删除卡片实例数据hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onRemoveForm');// 删除之前持久化的卡片实例数据// 此接口请根据实际情况实现,具体请参考:FormExtAbility Stage模型卡片实例}onConfigurationUpdate(config: Configuration) {// 当前formExtensionAbility存活时更新系统配置信息时触发的回调。// 需注意:formExtensionAbility创建后10秒内无操作将会被清理。hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onConfigurationUpdate:' + JSON.stringify(config));}onAcquireFormState(want: Want) {// 卡片提供方接收查询卡片状态通知接口,默认返回卡片初始状态。return formInfo.FormState.READY;}
}

打开WidgetCard.ets卡片页面

上面的常量都在下面引用,可以直接删掉

@Entry
@Component
struct WidgetCard {build() {Column(){Text('标题').fontSize(18)Button('按钮1').onClick(()=>{console.info('aaa','点击了1')postCardAction(this,{action: 'router',abilityName: 'EntryAbility',params: { targetPage: 'funA' }})})Button('按钮2').onClick(()=>{console.info('aaa','点击了2')postCardAction(this,{action: 'router',abilityName: 'EntryAbility',params: {targetPage: 'funB' }})})}.height('100%').width('100%')}
}

因为 abilityName,拉起的是EntryAblity,要修改一下该生命周期

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = 'EntryAbility';
const DOMAIN_NUMBER: number = 0xFF00;export default class EntryAbility extends UIAbility {private selectPage: string = '';private currentWindowStage: window.WindowStage | null = null;onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 获取router事件中传递的targetPage参数hilog.info(DOMAIN_NUMBER, TAG, `Ability onCreate: ${JSON.stringify(want?.parameters)}`);if (want?.parameters?.params) {let params: Record<string, Object> = JSON.parse(want.parameters.params as string);this.selectPage = params.targetPage as string;hilog.info(DOMAIN_NUMBER, TAG, `onCreate selectPage: ${this.selectPage}`);}}// 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(DOMAIN_NUMBER, TAG, `Ability onNewWant: ${JSON.stringify(want?.parameters)}`);if (want?.parameters?.params) {let params: Record<string, Object> = JSON.parse(want.parameters.params as string);this.selectPage = params.targetPage as string;hilog.info(DOMAIN_NUMBER, TAG, `onNewWant selectPage: ${this.selectPage}`);}if (this.currentWindowStage !== null) {this.onWindowStageCreate(this.currentWindowStage);}}onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilitylet targetPage: string;// 根据传递的targetPage不同,选择拉起不同的页面switch (this.selectPage) {case 'funA':targetPage = 'pages/Fun1';break;case 'funB':targetPage = 'pages/Fun2';break;default:targetPage = 'pages/Index';}if (this.currentWindowStage === null) {this.currentWindowStage = windowStage;}windowStage.loadContent(targetPage, (err, data) => {if (err.code) {hilog.error(DOMAIN_NUMBER, TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');return;}hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');});}
}

点击那个按钮就跳转那个页面

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux容器基础-namespace-3(pid)
  • 学习记录——day34 IO多路复用 fcntl select poll select实现聊天室
  • C#工具库-NPOI
  • 案例分享—优秀国外界面设计配色舒适的原因
  • Kubernetes--深入Pod
  • MySQL索引失效的场景
  • Linux~系统基础学习
  • 深入探讨SD NAND的SD模式与SPI模式初始化
  • [数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别
  • 数组去重的12重方法
  • 运维大规模K8S集群注意事项
  • java 函数接口Consumer简介与示例【函数式编程】【Stream】
  • 大学生实用工具!分享5款靠谱AI一键生成毕业论文的网站
  • 5个免费在线 AI 绘画网站推荐,附100+提示词!
  • 什么是上网行为管理呢?【上网行为管理系统功能介绍 】
  • 「面试题」如何实现一个圣杯布局?
  • 【附node操作实例】redis简明入门系列—字符串类型
  • co模块的前端实现
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Less 日常用法
  • MySQL-事务管理(基础)
  • win10下安装mysql5.7
  • Xmanager 远程桌面 CentOS 7
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 微信公众号开发小记——5.python微信红包
  • 微信开源mars源码分析1—上层samples分析
  • 我的面试准备过程--容器(更新中)
  • 在weex里面使用chart图表
  • 转载:[译] 内容加速黑科技趣谈
  • 最简单的无缝轮播
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # 职场生活之道:善于团结
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • %check_box% in rails :coditions={:has_many , :through}
  • (20)docke容器
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)fgets与fputs函数详解
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (八十八)VFL语言初步 - 实现布局
  • (独孤九剑)--文件系统
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)php新闻发布平台 毕业设计 141646
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)linux下的时间函数使用
  • (转)平衡树
  • .net framework4与其client profile版本的区别
  • .netcore 获取appsettings
  • .net反混淆脱壳工具de4dot的使用
  • .NET正则基础之——正则委托
  • /etc/fstab和/etc/mtab的区别