更多内容请访问:OpenHarmony技术社区https://ost.51cto.com前言在阅读本文之前,您需要熟悉自己了解原子服务的特点和流程HarmonyOS-5分钟教你原子服务基本概念服务卡片(以下简称“卡片”)是FA的一种界面展示形式,将FA的重要信息或操作放在前台到卡,实现直接服务,降低体验层次。卡片常用于嵌入其他应用程序(目前仅支持系统应用程序)作为其界面的一部分显示,并支持拉起页面、发送消息等基本交互功能。卡片消费者负责展示卡片。卡片提供者的开发者只需要作为卡片提供者开发服务卡片的内容,控制卡片实际显示的内容,控件的布局,控件点击事件的宿主应用。卡片用户显示卡片内容,控制卡片在主机中的显示位置。卡片管理服务用于管理系统中新增卡片的常驻代理服务,包括卡片对象的管理和使用,卡片的周期刷新等。注意卡片的使用者和提供者不需要常驻操作.当需要添加/删除/请求更新卡片时,卡片管理服务会拉取卡片提供商获取卡片信息。服务卡的运行机制先上图所示:卡管理服务包括以下模块:周期刷新:添加卡后,启动定时任务根据刷新策略周期性触发卡的刷新的卡。卡片缓存管理:将卡片添加到卡片管理服务后,缓存卡片的视图信息,以便下次获取卡片时直接返回缓存的数据,减少延迟。卡片生命周期管理:当卡片切换到后台或被阻塞时,暂停卡片的刷新;卡片升级/卸载场景下卡片数据更新和清空。卡片用户对象管理:管理卡片用户的RPC对象,用于卡片更新后用户请求的校验和回调处理。通信适配层:负责与卡用户和提供者的RPC通信。卡片提供者包括以下模块:卡片服务:由卡片提供者的开发者实现。开发者实现onCreateForm、onUpdateForm、onDeleteForm处理卡片的创建、更新、删除请求,并提供相应的卡片服务。Cardprovider实例管理模块:由cardprovider开发者实现,负责对cardmanagementservice分配的cardinstance进行持久化管理。通信适配层:HarmonyOSSDK提供,负责与卡片管理服务通信,用于主动向卡片管理服务推送卡片的更新数据。服务卡开发介绍关于服务卡的接口说明,Java卡和JS卡的选择,约束和限制,可以去官网查看:服务卡开发介绍Java卡开发这回,我们先讲解Java卡的开发,后面会专门写一篇文章来讲解JS卡的开发。使用DevEcoStudio创建卡片工程(上一篇文章有??讲解,这里不再赘述)。我们看一下配置文件config.json:"forms":[{"landscapeLayouts":["$layout:form_weather_widget_2_2"],"isDefault":true,"scheduledUpdateTime":"10:30","defaultDimension":"2*2","name":"widget","description":"Thisisaservicewidget","colorMode":"auto","type":"Java","supportDimensions":["2*2"],"portraitLayouts":["$layout:form_weather_widget_2_2"],"updateEnabled":true,"updateDuration":1}],"type":默认值为JS,我们需要将其改为"Java"代表Java卡。“scheduledUpdateTime”:表示卡的定点刷新时间,采用24小时制,精确到分钟。但是我设置时间点的时候并没有更新。具体原因待查。"scheduledUpdateTime":"10:30","updateEnabled":表示卡片是否支持周期刷新,取值范围:true:表示支持周期刷新。false:表示不支持周期刷新。“updateDuration”:表示卡片定时刷新的更新周期,单位为30分钟,取值为自然数。当值为0时,表示该参数不生效。当该值为正整数N时,表示刷新周期为30*N分钟。"updateEnabled":true,"updateDuration":1设置卡片定期刷新,每30分钟刷新一次。"supportDimensions":表示卡片支持的外观规格,取值范围:1*2:表示1行2列的二元网格。2*2:表示2行2列的四方形网格。2*4:表示2行4列的八边形网格。4*4:表示第十六格,4行4列。"portraitLayouts":表示卡片外观规范对应的垂直布局文件,与supportDimensions中的规范一一对应。仅当卡片类型为JavaCard时才需要配置该标签。"landscapeLayouts":表示卡片外观规范对应的横向布局文件,与supportDimensions中的规范一一对应。仅当卡片类型为JavaCard时才需要配置该标签。2、在MainAbility中覆盖卡片相关的回调函数。onCreateForm(意图意图)。onUpdateForm(长formId)。onDeleteForm(长formId)。onCastTempForm(长formId)。onEventNotify(映射表单事件)。onAcquireFormState(意图意图)。当卡片用户请求获取卡片时,卡片提供者会被拉起并调用onCreateForm(Intentintent)回调。Intent中会包含卡片ID、卡片名称、临时卡片标识和卡片外观规格信息。代码如下:protectedProviderFormInfoonCreateForm(Intentintent){HiLog.info(TAG,"onCreateForm");//卡片IDlongformId=intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY,INVALID_FORM_ID);//卡片名称StringformName=intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);//卡片规格intdimension=intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY,DEFAULT_DIMENSION_2X2);HiLog.info(TAG,"onCreateForm:formId="+formId+",formName="+formName+",dimension="+dimension);//将卡片信息存入数据库saveFormInfo(formId,formName,dimension);//开发者需要获取对应的xml布局,根据卡片名称和外观规范构造卡片对象,这里ResourceTable.Layout_form_weather_widget_2_2ProviderFormInfoformInfo=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);//获取这个ProviderFormInfo对象中包含的ComponentProviderdataComponentProvidercomponentProvider=formInfo.getComponentProvider();//设置组件的文本内容componentProvider.setText(ResourceTable.Id_weather_text,"Weather:Cloudy");componentProvider.setText(ResourceTable.Id_weather_temperature,"气温:29度");componentProvider.setText(ResourceTable.Id_weather_ph,"PH值:2.9");//将ComponentProvider中指定的操作合并到这个ProviderFormInfo对象包含的ComponentProvider对象中formInfo.mergeActions(componentProvider);返回表单信息;}布局:form_weather_widget_2_2.xml。
