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

关于元服务项目的创建与多线程

1. 元服务项目 刚建立的元服务项目类似一个微信小程序,它需要创建一个卡片来建立联系,通过点击卡片可以进入元服务项目。 例如,该项目只有一个HelloWorld页面,如果不建立卡片在退出该元服务项目页面并清空后台将无法再次进入该元服务项目。 2. 创建卡片 在根目录的src/main/ets下新建Service Widget下的Service Widget文件,选择完模版格式后,编译器会提供两个文件,entryformability和你自己命 名的卡片文件名 如我的文件名是mywideget,那么编译器会在这两个文件夹生成两个文件,mywidget.ts和entryformability.ts 3. EntryFormAbility文件 该文件是卡片的入口文件,里面定义了卡片的属性,比如卡片的图标,名称,描述,以及卡片的启动方式 onAddForm(want: Want){...}是卡片启动方式,当点击卡片时,会调用这个方法 用户添加卡片到桌面时,系统会创建并初始化 EntryFormAbility,执行 onAddForm 完成卡片数据绑定。 生命周期回调执行完毕后,EntryFormAbility 不会一直运行,大约 10 秒后会被系统回收销毁 <!----------------------------------------------------------------------------------->formBindingData.createFormBindingData(formDate2) formBindingData: 鸿蒙提供的表单数据绑定模块,可以将数据绑定到表单中。 createFormBindingData: 将普通的 JS/TS 对象 (formDate2) 转换成系统能识别的 FormBindingData 对象。 这一步是卡片运行在桌面进程,你的应用运行在应用进程,数据需要序列化打包才能跨进程传递,formDate2是普通对象,需要转换成FormBindingData对象。 return formBindingData.createFormBindingData(formData); 可以返回数据给卡片,卡片接收到数据后,会显示在卡片上。 wantParams: Record<string, Object> 是一种用于在 Ability 之间传递数据的键值对参数类型,它是 Want 对象中 parameters 属性的类型定义。 <!------------------------------------------------------------------------------------> formProvider.updateForm(formId, bindData); formProvider: 表单提供者模块。 updateForm: 这是真正触发桌面卡片刷新的 API。 参数: formId: 告诉系统更新哪一张卡片。 bindData: 告诉系统用什么新数据来渲染。 结果: 执行后,用户桌面上的卡片文字会从“卡片标题 1"和“卡片内容 1"立刻变成“卡片标题 2"和“卡片内容 2"。 <!-----------------------------------------------------------------------------------> wantParams[formInfo.FormParam.IDENTITY_KEY] as string formInfo.FormParam.IDENTITY_KEY: 这是一个系统常量(通常对应字符串 "formId")。 wantParams[...]: 从参数中取出这个 key 对应的值。 formId: 这是当前卡片实例的唯一身份证。 如果用户在桌面上添加了两个相同的卡片,它们会有不同的 formId。 你要更新哪一个卡片,就必须知道它的 formId 4. mywidget.ts文件 该文件是卡片的逻辑文件,里面定义了卡片的逻辑,比如点击卡片后跳转到新的页面,点击卡片后执行某个方法,点击卡片后显示某个弹窗等等 <!------------------------------------------------------------------------------------> @Entry(localStorage) 将 LocalStorage 实例注入到页面根组件,使得: 当前页面内所有子组件自动获得对该 LocalStorage 实例的访问权限 无需逐层传递状态,子组件通过 @LocalStorageProp 或 @LocalStorageLink 即可绑定状态 实现跨组件状态同步,兄弟组件、父子组件可通过同一个 LocalStorage 实例通信 <!------------------------------------------------------------------------------------> 5. dataPreferences 是鸿蒙提供的 轻量级键值对(key-value)持久化存储。简单理解:一个可以跨进程访问的公共记事本。 适用场景 保存少量简单数据:formId、用户名、设置项 主应用 ↔ 卡片 之间共享数据(多进程场景) 重启 APP 数据不丢失 特点 键值对存储,简单好用 异步 API,必须用 async/await 跨进程共享(卡片 & 主应用都能读写) 持久化:存在手机本地文件 AppStorage与其不同,AppStorage是只能在同一进程下使用,卡片和主页面是两个独立进程,共享数据必须用公共存储 dataPreferences 卡片和主页面 不在同一个房间(进程隔离),卡片 = 房间 A,主页面 = 房间 B,两个房间完全隔离,不能互相看见对方的变量,AppStorage 是房间内的备忘录 只能在自己房间用,不能跨房间共享 导入模块 (EntryFormAbility与Index都要加) import dataPreferences from '@ohos.data.preferences'; 异步保存到 dataPreferences(不阻塞卡片加载)卡片中保存 formId (async () => { let pref = await dataPreferences.getPreferences(this.context, 'my_form_store'); await pref.put('formId', formId); console.log('卡片保存 formId 成功:', formId); })(); 主页面读取 formId 并更新卡片 let pref = await dataPreferences.getPreferences(getContext(), 'my_form_store'); this.formId = await pref.get('formId', '') as string; 上下文 context 区别 卡片中(EntryFormAbility)使用:this.context 主页面中(Index.ets)使用:getContext() 为什么卡片保存要用 (async () => {})() 包裹 onAddForm 是同步生命周期方法,不允许加 async 包裹异步函数可以不阻塞卡片初始化,保证卡片正常显示 存储名称必须一致 保存和读取时第二个参数必须相同,如 my_form_store 名称不同会导致数据找不到,formId 读取为空 数据类型说明 dataPreferences 支持存储字符串、数字、布尔等简单类型 不支持直接存储对象,复杂数据需转为 JSON 字符串 删除某条数据:await pref.delete('formId') 清空所有数据:await pref.clear() <!-------------------------------------------------------------------------------->
http://www.cnnetsun.cn/news/1922574.html

相关文章:

  • Towards Comprehensive Lecture Slides Understanding: Large-scale Dataset and Effective Method
  • 从零到产品:手把手教你用nRF Connect完成蓝牙硬件原型开发(Android版)
  • 如何在可视化编辑器中回滚错误的结构修改_通过事务或备份快速恢复元数据
  • Navicat12破解避坑指南:如何安全使用注册机激活(最新实测有效)
  • IM(即时通讯)系统
  • JPEXS Free Flash Decompiler深度解析:从字节码到可读代码的技术揭秘
  • 3步解锁小爱音箱全能音乐中心:告别版权限制的自由听歌方案
  • 终极指南:如何用RyzenAdj释放AMD锐龙处理器全部潜能
  • SQLmap-GUI终极指南:如何快速掌握图形化SQL注入渗透测试工具
  • 嵌入式:中断风暴成因与应对
  • NaViL-9B开源镜像优势解析:Clash清理+多卡兼容+eager注意力回退
  • 痛点驱动:图片插入Word文档工具在3个典型场景的应用
  • 基于 CNN-SE Attention-ITCN 多模态融合的多输入单输出回归预测模型【MATLAB】
  • MyBatis-Plus 分页查询两种实现方案
  • 手把手教你用STM32CubeMX配置PWM,轻松玩转L298N和L9110S电机调速
  • 如何3步掌握FunClip:开源AI视频智能剪辑工具终极指南
  • 如何利用开源工具实现网盘下载速度突破:高效解决方案指南
  • Visual C++运行库终极指南:一键解决DLL缺失问题的完整方案
  • APM飞控实战:从零搭建一台稳定四旋翼
  • 用STAR数据集搞定卫星图像分析:从对象检测到场景关系推理的完整实战指南
  • 在LVGL上实现一个可交互的音频均衡器:手把手教你用贝塞尔曲线绘制平滑EQ曲线
  • 数字化车间无线联网解决方案
  • 告别电脑噪音烦恼:5分钟掌握Windows风扇智能控制神器FanControl
  • 终极指南:如何用MAA实现明日方舟全自动日常管理
  • Windows风扇控制神器:用FanControl打造你的专属静音散热系统
  • 如何在Mac与Windows间架起高效通信桥梁:飞秋Mac版完全指南
  • 3步搞定全网资源下载:告别繁琐操作,用res-downloader轻松获取无水印内容
  • 网络工程师避坑指南:H3C HCL_v3.0.1.1+WSL2共存配置全流程
  • 告别手动!用C# .NET给AutoCAD写个批量打印PDF的脚本(附完整代码)
  • 终极桌面革命:用Rainmeter打造你的Windows数字画布