了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com前言如下鸿蒙-后服务卡高级(1),增加服务卡信息持久化和卡控事件的内容。服务卡信息持久化由于大部分卡商不是常驻服务,只有在需要的时候才会拉起获取卡信息。而且卡管理服务支持卡的多实例管理,卡ID对应实例ID。因此,如果卡商支持卡数据的配置,则卡商需要根据卡ID对卡业务数据进行持久化管理,以便在后续获取、更新、拉取时能够得到正确的卡业务数据向上。同时需要适配onDeleteForm(intformId)卡片删除通知接口,实现卡片实例数据的删除。同JS卡片,需要注意的是卡片用户在请求卡片时传递给provider应用的Intent数据中有一个临时标签字段,表示请求的卡片是否为临时卡片,因为临时卡有一个非持久化的特殊在某些场景下,比如卡服务框架死机重启,此时临时卡数据已经在卡管理服务中删除,相应的卡ID不会通知到提供商,因此卡提供商需要负责清理长期未删除的临时卡数据。同时,相应的卡用户可以将之前请求的临时卡转换为普通卡。如果转换成功,卡商还需要处理对应的临时卡ID,将卡商记录的临时卡数据转换为普通卡数据,防止提供商在清理时转换转换后的临时卡长期未删除的临时卡。普通卡的临时卡信息被删除,导致卡信息丢失。//临时标志字段,表示请求的卡片是否为临时卡片booleantempFlag=intent.getBooleanParam(AbilitySlice.PARAM_FORM_TEMPORARY_KEY,false);普通卡:持卡人将持有的卡。临时卡:不会被持卡人永久保留的卡片。临时卡转普通卡触发protectedvoidonCastTempForm(longformId){//用户临时卡转普通卡触发,provider需要做相应处理super.onCastTempForm(formId);//todo}要创建的卡片信息会保留下来,以便下次获取/更新卡片实例时使用。//将卡片信息存入数据库saveFormInfo(formId,formName,dimension);privatevoidsaveFormInfo(LongformId,StringformName,intdimension){FormInfoform=newFormInfo(formId,formName,dimension);DatabaseUtils.insertForm(this,form);OrmDatabase对象数据库部分可以参考肖宇博先生带来的HarmonyOS-十分钟教学数据库快速入门文章,文章详细介绍了对象数据库的配置和创建,表,相应实体类的属性,以及ormContext的创建。Java卡控制事件Java卡目前通过IntentAgent功能支持卡控制设置事件。比如你可以使用START_ABILITY和START_SERVICE这两种能力,在点击整张卡片的时候跳转到提供卡片的能力。(注:Intent支持传递自定义参数,支持的类型有int/long/String/List)。//获取ComponentProvider,渲染卡片接口@OverrideprotectedProviderFormInfoonCreateForm(Intentintent){HiLog.info(TAG,"onCreateForm");//卡片IDlongformId=intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY,INVALID_FORM_ID);//卡片名称字符串formName=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布局,根据卡片名称和外观规范Object构造卡片,这里ResourceTable.Layout_form_weather_widget_2_2ProviderFormInfoformInfo=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);//获取这个ProviderFormInfo对象中包含的ComponentProvider数据。ComponentProvidercomponentProvider=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.setIntentAgent(ResourceTable.Id_weather_text,startAbilityIntentAgent());//将ComponentProvider中指定的操作合并到这个ProviderFormInfo对象包含的ComponentProvider中formInfo.mergeActions(componentProvider);返回表单信息;上面我们可以通过componentProvider的setIntentAgent方法为卡片上的组件设置点击事件。第一个参数是组件的资源id,第二个参数是IntentAgent对象。示例代码如下:componentProvider.setIntentAgent(ResourceTable.Id_weather_text,startAbilityIntentAgent());获取IntentAgent对象,示例代码如下:privateIntentAgentstartAbilityIntentAgent(){Intentintent=newIntent();操作operation=newIntent.OperationBuilder().withDeviceId("").withBundleName("com.example.weatherservicecard").withAbilityName("com.example.weatherservicecard.MainAbility").build();intent.setOperation(操作);List
