更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.com论坛中涌现出优秀的服务卡作品和相关文章。我几乎阅读了专栏中所有关于服务卡开发和分享的文章,从每篇文章中提取和吸收精华,并将其融入到本文中。一些比较明显的介绍性内容本文会略去(比如卡有多少size等),但是一些我觉得比较重要的内容虽然在很多文章里都有说明,我还是会再记录一遍(例如卡片的框架)。另外,作为学习笔记,我会记录下自己在学习物种中遇到的一些新名词概念。这些概念大家可能都比较熟悉,这部分可以直接忽略;文章内容综合自论坛种的多篇文章,所以你可能会在本文中看到自己文章的影子。服务卡框架服务卡总体框架主要包括三部分:卡用户、卡管理服务和卡提供者。概念如下:●卡片用户:显示卡片内容的宿主应用,控制卡片在宿主中的显示位置,如桌面、服务中心、搜索等。●卡片管理服务:卡片管理服务:常驻代理服务,用于管理系统中新增的卡片,包括卡片对象的管理和使用,卡片的周期刷新等。●卡片提供者:HarmonyOS应用或原子服务,提供卡片展示内容,控制卡片展示内容,控制布局,控制点击事件。卡片运行框架如下:精简版示意图详细版示意图卡片常用功能比较Java卡片和JS卡片功能对比MainAbility自动生成函数分析在新建服务卡片时,会生成一些回调方法在MainAbility类中,具体方法及其回调条件如下图所示。在后面具体的卡片操作中,调用的回调方法也会被再次声明。在onCreatForm(Intent)方法中,cardprovider拉起后,intent会携带card相关的信息,如下:servicecard生命周期回调函数时序如下:配置cardeditingfunction一些servicecards需要有可编辑的能力,比如天气应用城需要编辑。具体实现方法如下:在config.json中,将formConfigAbility的属性配置添加到某个表单的配置中,实现编辑功能。formConfigAbility的值是url格式的Ability名称。如果不配置formConfigAbility,则不会显示编辑菜单。示例代码如下:(摘自【一文看懂HarmonyOS服务卡运行原理及开发方法】)jpg?x-oss-process=image/resize,w_1080,h_478)卡片的定点/定时刷新:回调updateForm()方法运行机制示意图如下:注:同时定时刷新时和定点刷新,定时刷新优先。JS卡的定点更新步骤:1.关闭定时更新:修改updateDuration为0禁用定时刷新(在config.json文件中)2.设置scheduledUpdateTime的时间3.重写updateFormData()方法4.将要刷新的数据存储在一个ZSONObject实例中5.将这个实例封装在一个FormBindingData实例bindingData中6.调用MainAbility方法updateForm(),将bindingData作为第二个实参。JS卡片重写updateFormData()方法的代码如下:JAVA卡片定点更新步骤:1.前三步与JS卡片相同。2.构造一个ComponentProvider的实例来表示一个Java卡实例。就是根据卡片的大小得到的布局文件。然后调用setText()方法修改卡片标题;最后调用MainAbility的updateForm()方法,将componentProvider作为第二个实参。JAVA卡片重写updateFormData()方法代码如下:卡片刷新的最小单位时间为30分钟,带来两个问题:1.卡片创建后的前30分钟不会刷新,所以它需要执行手动刷新。2、如果你写的是刷新间隔小于30分钟的卡片(比如每秒刷新一次的时钟卡片),你需要重新创建一个timer实例来设置刷新时间。添加手动刷新:使用onCreateForm()调用onUpdateForm(formId),代码摘自良子里的哔哩哔哩卡片@OverrideprotectedProviderFormInfoonCreateForm(Intentintent){...//初始化时在线更新卡片onUpdateForm(formId);returnformController.bindFormData();}将刷新时间代码重写为摘自Codelabs时钟FA卡开发样例的代码privatevoidstartTimer(){Timertimer=newTimer();timer.schedule(newTimerTask(){@Overridepublicvoidrun(){updateForms();}},0,SEND_PERIOD);}privatevoidupdateForms(){//从数据库中获取卡片信息HiLog.info(LABEL,"从数据库中获取卡片");OrmPredicatesormPredicates=newOrmPredicates(Form.class);List
