0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Java开发HarmonyOS服务卡片

OpenHarmony技术社区 来源:OpenHarmony技术社区 作者:贾叶照 2022-04-26 11:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

看本文章之前需要先熟悉一下原子化服务特征和流程 HarmonyOS-5分钟教会你原子化服务。

服务卡片(以下简称“卡片”)是 FA 的一种界面展示形式,将 FA 的重要信息或操作前置到卡片,以达到服务直达,减少体验层级的目的。

卡片常用于嵌入到其他应用(当前只支持系统应用)中作为其界面的一部分显示,并支持拉起页面,发送消息等基础的交互功能。卡片使用方负责显示卡片。

卡片提供方:开发者仅需作为卡片提供方进行服务卡片内容的开发,控制卡片实际显示的内容、控件布局以及控件点击事件。

卡片使用方:显示卡片内容的宿主应用,控制卡片在宿主中展示的位置。

卡片管理服务:用于管理系统中所添加卡片的常驻代理服务,包括卡片对象的管理与使用,以及卡片周期性刷新等。

明:卡片使用方和提供方不要求常驻运行,在需要添加/删除/请求更新卡片时,卡片管理服务会拉起卡片提供方获取卡片信息。

服务卡片的运作机制

先上图:

ea24f37e-c480-11ec-bce3-dac502259ad0.png

卡片管理服务包含以下模块:
  • 周期性刷新:在卡片添加后,根据卡片的刷新策略启动定时任务周期性触发卡片的刷新。

  • 卡片缓存管理:在卡片添加到卡片管理服务后,对卡片的视图信息进行缓存,以便下次获取卡片时可以直接返回缓存数据,降低时延。

  • 卡片生命周期管理:对于卡片切换到后台或者被遮挡时,暂停卡片的刷新;以及卡片的升级/卸载场景下对卡片数据的更新和清理。

  • 卡片使用方对象管理:对卡片使用方的 RPC 对象进行管理,用于使用方请求进行校验以及对卡片更新后的回调处理。

  • 通信适配层:负责与卡片使用方和提供方进行 RPC 通信。

卡片提供方包含以下模块:
  • 卡片服务:由卡片提供方开发者实现,开发者实现 onCreateForm、onUpdateForm 和 onDeleteForm 处理创建卡片、更新卡片以及删除卡片等请求,提供相应的卡片服务。

  • 卡片提供方实例管理模块:由卡片提供方开发者实现,负责对卡片管理服务分配的卡片实例进行持久化管理。

  • 通信适配层:HarmonyOS SDK 提供,负责与卡片管理服务通信,用于将卡片的更新数据主动推送到卡片管理服务。

服务卡片开发简介

关于服务卡片的接口说明,Java 卡片与 JS 卡片选型,约束与限制可以去官网上查看:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-widget-provider-intro-0000001150722105

Java 卡片开发

这次先来讲解 Java 卡片开发,后期会专门用一篇来讲解 JS 卡片开发。

使用 DevEco Studio 创建卡片工程(前面文章已经说明,这里不再累述)。

我们先看看配置文件 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 中的规格一一对应。仅当卡片类型为 Java 卡片时,需要配置该标签

⑦“landscapeLayouts”:表示卡片外观规格对应的横向布局文件,与 supportDimensions 中的规格一一对应。仅当卡片类型为 Java 卡片时,需要配置该标签。

MainAbility 中覆写卡片相关回调函数:
  • onCreateForm(Intent intent)

  • onUpdateForm(long formId)

  • onDeleteForm(long formId)

  • onCastTempForm(long formId)

  • onEventNotify(Map formEvents)

  • onAcquireFormState(Intent intent)

当卡片使用方请求获取卡片时,卡片提供方会被拉起并调用 onCreateForm(Intent intent) 回调,intent 中会带有卡片 ID,卡片名称,临时卡片标记和卡片外观规格信息。

代码如下:
protectedProviderFormInfoonCreateForm(Intentintent){
HiLog.info(TAG,"onCreateForm");
//卡片id
longformId=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_2
ProviderFormInfoformInfo=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);
//获取此 ProviderFormInfo 对象中包含的ComponentProvider数据。
ComponentProvidercomponentProvider=formInfo.getComponentProvider();
//设置组件的文本内容
componentProvider.setText(ResourceTable.Id_weather_text,"天气:多云");
componentProvider.setText(ResourceTable.Id_weather_temperature,"温度:29度");
componentProvider.setText(ResourceTable.Id_weather_ph,"PH值:2.9");
//将ComponentProvider中指定的操作合并到此ProviderFormInfo对象中包含的ComponentProvider对象中
formInfo.mergeActions(componentProvider);
returnformInfo;
}

布局:form_weather_widget_2_2.xml


<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:background_element="#FFFFFFFF"
ohos:remote="true">

<Image
ohos:height="match_parent"
ohos:width="126vp"
ohos:horizontal_center="true"
ohos:image_src="$media:weather"
ohos:scale_mode="zoom_start"
ohos:top_margin="17vp"/>

<DirectionalLayout
ohos:height="match_content"
ohos:width="match_content"
ohos:align_parent_bottom="true"
ohos:bottom_margin="12vp"
ohos:horizontal_center="true"
ohos:orientation="vertical">

<Text
ohos:id="$+id:weather_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="天气:晴"
ohos:text_color="#E5000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>

<Text
ohos:id="$+id:weather_temperature"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="温度:25度"
ohos:text_color="#99000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>
<Text
ohos:id="$+id:weather_ph"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="PH值:2.5"
ohos:text_color="#99000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>
DirectionalLayout>
DependentLayout>

ea32d7d2-c480-11ec-bce3-dac502259ad0.png当需要卡片提供方更新数据时(如触发了定时更新、定点更新或者卡片使用方主动请求更新),卡片提供方获取最新数据,并调用 updateForm 接口更新卡片。

示例如下:

protectedvoidonUpdateForm(longformId){
HiLog.info(TAG,"onUpdateForm");
super.onUpdateForm(formId);
refeshData();
}

/**
*updateforms
*/
privatevoidrefeshData(){
//获取卡片集合
ListformList=DatabaseUtils.queryForms(this,null);

for(FormInfoformInfo:formList){
ProviderFormInforefesh=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);

ComponentProvidercomponentProvider=refesh.getComponentProvider();
//这里更新的值,实际使用中可根据自己项目要求设置,比如:随机获取一个值
componentProvider.setText(ResourceTable.Id_weather_text,"天气:多云转晴");
componentProvider.setText(ResourceTable.Id_weather_temperature,"温度:30度");
componentProvider.setText(ResourceTable.Id_weather_ph,"PH值:3.0");
try{
//卡片提供方主动更新卡片
updateForm(formInfo.getFormId(),componentProvider);
}catch(FormExceptione){
HiLog.error(TAG,"FormException");
}
}
}

定时更新效果:

ea41873c-c480-11ec-bce3-dac502259ad0.png

总结

实际项目中需要通过网络获取数据,这里只是简单的模拟数据。

只是简单说明了服务卡片创建的回调方法实现,定点和定时数据更新的时机和回调方法的实现,下期会更新关于服务卡片信息持久化、卡片控制事件。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115682
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35576

原文标题:用Java开发HarmonyOS服务卡片

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOSAI编程万能卡片生成(二)

    两种方式来触发卡片页面刷新;对于元服务工程生成的卡片,数据交互为通过网络请求方式触发卡片页面刷新。 卡片事件:使用router事件跳转到指定
    发表于 09-09 16:10

    HarmonyOSAI编程万能卡片生成(一)

    基于AI大模型理解开发者的卡片需求信息,通过对话式的交互智能生成HarmonyOS万能卡片工程。 使用约束 建议从以下维度描述卡片需求: 当
    发表于 09-08 17:09

    Perforce JRebel 简介:即时加载代码变更,加速Java应用开发

    Perforce JRebel 专为Java开发提速而生!支持跳过构建与重新部署,实时加载代码变更,支持100+框架,无缝集成主流IDE与应用服务器。
    的头像 发表于 08-14 14:35 487次阅读
    Perforce JRebel 简介:即时加载代码变更,加速<b class='flag-5'>Java</b>应用<b class='flag-5'>开发</b>

    HarmonyOS AI辅助编程工具(CodeGenie)卡片生成

    基于AI大模型理解开发者的卡片需求信息,通过对话式的交互智能生成HarmonyOS万能卡片工程。 一、 使用约束 建议从以下维度描述卡片需求
    发表于 08-12 11:04

    HarmonyOS 5】金融应用开发鸿蒙组件实践

    HarmonyOS 5】金融应用开发鸿蒙组件实践 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#
    的头像 发表于 07-11 18:20 752次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】金融应用<b class='flag-5'>开发</b>鸿蒙组件实践

    HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

    HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙
    的头像 发表于 07-07 11:57 796次阅读
    【 <b class='flag-5'>HarmonyOS</b> 5 入门系列 】鸿蒙<b class='flag-5'>HarmonyOS</b>示例项目讲解

    FA模型卡片和Stage模型卡片切换

    卡片切换 卡片切换主要包含如下三部分: 卡片页面布局:FA模型卡片和Stage模型卡片的布局都采用类web范式
    发表于 06-06 08:10

    HarmonyOS5云服务技术分享--ArkTS开发函数

    等打包 ✅ 支持Node.js 14.x/18.x和Java 1.8 ✅ 支持HTTP触发器调用 ✅ 持续开发调试一条龙 ?️ 准备工作: 安装AGCLI工具(华为应用分发服务命令行工具) 准备测试
    发表于 05-22 17:29

    HarmonyOS5云服务技术分享--ArkTS开发Node环境

    ✨ 你好呀,开发者小伙伴们!今天我们来聊聊如何在HarmonyOS(ArkTS API 9及以上)中玩转云函数,特别是结合Node.js和HTTP触发器的开发技巧。文章会手把手带你从零开始,
    发表于 05-22 17:21

    HarmonyOS5云服务技术分享--云函数创建配置指南

    大家好!今天咱们来一起探索如何在华为HarmonyOS的AGC云函数服务中创建和配置函数,手把手教你HTTP触发器玩转云函数。无论你是刚入门还是想优化现有功能,这篇指南都会给你清晰的指引,咱们直接
    发表于 05-22 17:08

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让
    的头像 发表于 04-27 13:44 648次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>开发</b>者必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b><b class='flag-5'>开发</b>者在用?

    HarmonyOS NEXT 原生应用/元服务调试概述

    开发者更方便、高效地调试应用/元服务HarmonyOS应用/元服务调试支持使用真机设备、模拟器、预览器调试。接下来以使用真机设备为例进行说明,详细的调试流程如下图所示: 1.配置签
    发表于 02-26 11:03

    效率大升!AI赋能鸿蒙万能卡片开发

    万能卡片,作为鸿蒙生态应用和元服务的重要展示形式,凭借将关键信息和核心操作前置,实现服务直达、减少跳转层级的体验效果,备受用户和开发者青睐。但传统
    的头像 发表于 01-13 13:44 1377次阅读
    效率大升!AI赋能鸿蒙万能<b class='flag-5'>卡片</b><b class='flag-5'>开发</b>

    HarmonyOS开发指导类文档更新速递(下)

    伴随着HarmonyOS 5.0.0 Release、HarmonyOS 5.0.1 Release版本的发布,HarmonyOS官网文档也带来了不少上新内容。本期HarmonyOS
    的头像 发表于 12-30 09:54 2135次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发</b>指导类文档更新速递(下)

    SSM框架在Java开发中的应用 如何使用SSM进行web开发

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web开发中常用的技术栈。它通过分层架构,实现了视图、控制、业务逻辑和数据访问的分离,提高了代码的可维护性和可扩展性
    的头像 发表于 12-16 17:28 2131次阅读