卡片代码生成器 json卡片代码( 二 )

鸿蒙系统中,卡片用Form来表示 。上述声明中,formsEnabled用于指示这个Ability是用于定义卡片的 。forms数组用来定义一系列的卡片 。通常多个卡片可以定义在一个数组元素中 。其中landscapeLayouts、portraitLayouts、supportDimensions用于定义卡片的布局文件和大小,updateEnabled、updateDuration用于控制卡片的数据更新,updateDuration的单位是半小时 。
生命周期在鸿蒙系统上,卡片的生命周期比普通的Page Ability要简单很多,只有三个相关的回调:
/** * 创建卡片时的回调 。* 在intent中,存有创建卡片的一些重要参数,可以通过Intent.getXXXParam()方法获取 。* AbilitySlice.PARAM_FORM_IDENTITY_KEY: long类型,用于唯一标识一个卡片 * AbilitySlice.PARAM_FORM_NAME_KEY: String类型,卡片名称,即在config.json中定义的name属性 * AbilitySlice.PARAM_FORM_DIMENSION_KEY: int类型,卡片大小标识,* 取值范围是1-4,分别表示1x2、2x2、2x4、4x4 */protected ProviderFormInfo onCreateForm(Intent intent)/** * 更新卡片时的回调 。* 这里的formId就是onCreateForm中的AbilitySlice.PARAM_FORM_IDENTITY_KEY参数 。*/protected void onUpdateForm(long formId)/** * 删除卡片时的回调 。* 这里的formId就是onCreateForm中的AbilitySlice.PARAM_FORM_IDENTITY_KEY参数 。*/protected void onDeleteForm(long formId)传输卡片内容卡片的创建和显示通常由桌面(或者服务中心、搜索)发起,而决定显示内容的是优酷卡片这个模块,内容提供方和显示方不在同一个进程,甚至由不同开发者开发 。在Android上也是一样的情况 。
在这种情况下,一般都是内容提供方通过远程View的方式将内容渲染到内容显示方的,鸿蒙系统上这个跨进程的数据传输行为是由ComponentProvider来实现的 。
创建ComponentProvider有两种方式:
// 第一种: 在onCreateForm()时,先创建一个卡片对应的ProviderFormInfo实例 。// 再通过ProviderFormInfo的实例拿到向它传输数据的ComponentProvider 。ProviderFormInfo form = new ProviderFormInfo(layoutId, context);ComponentProvider cp = form.getComponentProvider();// 第二种: 在onUpdateForm()时,直接创建出一个ComponentProvider 。ComponentProvider cp = new ComponentProvider(layoutId, context);需要注意的问题 1
其中设置IntentAgent时需要注意,通常一个布局中会有多个View来覆盖根布局的矩形区域 。如果设置了IntentAgent的View没有覆盖满根布局,则未覆盖区域被点击时,系统也会响应点击,默认调起这个卡片所属的Ability,传入的Intent只包含formId 。
针对这个默认调起的Ability,一般有两种方式解决:一是确保设置了IntentAgent的View覆盖满根布局;二是Ability提供兜底方案,例如页面做成透明,并且自动退出 。
需要注意的问题 2
在创建IntentAgent时,需要提供一个IntentAgentInfo实例 。这个IntentAgentInfo创建时的第一个参数是一个int类型的请求代码,这个代码必须保持各个卡片的不同点击区都不一样 。否则后设置的IntentAgent会覆盖先前设置的同一请求代码的IntentAgent 。
需要注意的问题 3
如果是跟优酷主客混合打包,卡片的布局文件中,View的id必须跟主客中所有的id不同,否则系统会无法正确更新布局文件中对应的View 。
打开中转页由于系统的限制,点击卡片打开的页面必须是纯鸿蒙应用中的页面,无法直接打开Android应用页面 。优酷卡片的点击,目的是打开优酷主客的播放页 。
在这里我们做了分类: