HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的场景来说,总需要用户点开App操作未免过于繁琐。

针对该问题, HarmonyOS SDK为用户提供了Form Kit(卡片开发服务),您可以将应用的重要信息或操作前置到卡片,以达到服务直达、减少体验层级的目的,用户无需打开App,根据引导将卡片添加到桌面,即可随时随地查看服务的重要信息和动态变化。

面对需要实时更新信息的App卡片,Push Kit (推送服务)向开发者提供了卡片刷新服务。应用通过集成Push Kit后获取Push Token,基于Push Kit的系统级通道,便可以在合适场景向用户即时推送卡片内容,从而提升用户的感知度和活跃度。

能力优势

可靠、稳定

应用无论是否在后台运行,通过Push Kit都能即时刷新服务内容。通过华为终端设备的长连接,充分保障刷新内容送达;系统级通道最高可提供每秒千万级的推送速度。

实时、灵活

由开发者在合适场景即时推送卡片封面内容,实时更新;支持图片、文本等多种格式刷新;并及时返回送达回执。

开发步骤

为方便App开发者接入,仅需五步即可完成卡片刷新功能的开发及卡片内容刷新。

1.参见创建一个ArkTS卡片,完成本地服务卡片的创建。

2.在项目模块级别下的src/main/resources/base/profile/form_config.json中配置dataProxyEnabled字段为true,开启卡片代理刷新功能。

{
  "forms": [
    {
      "name": "WidgetCard",
      "src": "./ets/widget/pages/WidgetCard.ets",
      "uiSyntax": "arkts",
      "window": {
        "designWidth": 720,
        "autoDesignWidth": true
      },
      "colorMode": "auto",
      "isDefault": true,
      "updateEnabled": true,
      "updateDuration": 1,
      "scheduledUpdateTime": "10:30",
      "defaultDimension": "2*2",
      "supportDimensions": ["2*2"],
      "dataProxyEnabled": true
    }
  ]
}

3.在卡片生命周期管理文件(下以EntryFormAbility为例)的onAddForm()回调中获取formId,定义需要在卡片页面文件(下以WidgetCard为例)中和通过Push Kit要刷新的字段,如下以text_key和image_key为例。

import { formBindingData, formInfo, FormExtensionAbility } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';

export default class EntryFormAbility extends FormExtensionAbility {
  onAddForm(want: Want): formBindingData.FormBindingData {
    // 获取formId
    const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;

    // 定义需要在WidgetCard中刷新的字段
    class CreateFormData {
      formId: string = '';
      text_key: string = '';
      image_key: string = '';
    }

    const obj: CreateFormData = {
      formId: formId,
      text_key: '默认文本',
      image_key: '',
    }
    const bindingData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);

    // 定义需要通过Push Kit代理刷新的字段,每个key均需要在上面bindingData中定义
    const text_key: formBindingData.ProxyData = {
       key: 'text_key',
       subscriberId: formId,
    };
    const image_key: formBindingData.ProxyData = {
       key: 'image_key',
       subscriberId: formId,
    };
    bindingData.proxies = [text_key, image_key];
    return bindingData;
  }
}

4.卡片页面文件( src/main/ets/widget/pages/WidgetCard.ets为例)中,创建LocalStorage变量并与@Entry装饰器绑定,使用@LocalStorageProp装饰器创建key-value的变量。

本文创建了formId、text和image三个变量,对应的key为formId、text_key和image_key,需要注意的是卡片页面布局中image对应的组件是Image图片组件,图片组件传递的变量必须以 memory:// 开头。

// 定义页面级的UI状态存储LocalStorage
const storage = new LocalStorage();

// 绑定
@Entry(storage)
@Component
struct WidgetCard {
  @LocalStorageProp('formId') formId: string = '';
  @LocalStorageProp('text_key') text: string = '';
  @LocalStorageProp('image_key') image: string = '';

  build() {
    Flex({ direction: FlexDirection.Column }) {
      Row() {
        Text() {
          // Span是Text组件的子组件,用于显示行内文本
          Span('formID:')
          Span(this.formId)
        }
        .fontSize(10)
      }

      Row() {
        Text() {
          Span('文本:')
          Span(this.text)
        }
        .fontSize(10)
      }

      Row() {
        if (this.image) {
          Image('memory://' + this.image).height(80)
        }
      }
    }
    .padding(10)
  }
}

5.建议您将formId、pushToken等信息上报到应用服务端,用于向应用发送卡片刷新消息。请参见指导获取Push Token。

// 以下为伪代码
import { Want } from '@kit.AbilityKit';
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { formInfo } from '@kit.FormKit';

async function saveFormInfo(want: Want): Promise<void> {
  try {
    const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
    const moduleName = want.moduleName;
    const abilityName = want.abilityName;
    const formName = want.parameters![formInfo.FormParam.NAME_KEY] as string;
    const pushToken: string = await pushService.getToken();

    // 将formId, moduleName, abilityName, formName, pushToken 上报到应用服务端
  } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, 'testTag', 'Save form info failed: %{public}s', e.message);
  }
}

6.应用服务端调用REST API推送卡片刷新消息,消息详情可参见场景化消息API接口功能介绍,请求示例如下:

// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send

// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---**** 
push-type: 1

// Request Body
{
    "payload": {
    "moduleName": "entry",
    "abilityName": "EntryFormAbility",
    "formName": "widget",
    "formId": 423434262,
    "version": 123456,
    "formData": {
      "text_key": "刷新文本内容"
    },
    "images": [
      {
        "keyName": "image_key",
        "url": "***", 
        "require": 1
      }
    ]
  },
  "target": {
    "token": [
      "IQAAAAC*************************dRH7_bPbfMrVfsYw"
    ]
  },
  "pushOptions": {
     "testMessage": true
  }
}

了解更多详情>>

获取卡片开发服务开发指导文档

获取推送卡片刷新消息开发指导文档

获取推送服务开发指导文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为啥很多人觉得编程难学?

看到推特上网友菜脯写的一条推文&#xff1a; 菜脯&#xff1a;我大概知道&#xff0c;为啥很多人觉得编程难学了。 因为对我来说&#xff0c;编程过程就是 看资料——开始写——遇到问题——查资料——解决问题——继续写——继续遇问题——继续查资料… 这个循环似乎会一直持…

Retrieval Augmented Thoughts(RAT):检索增强思维,实现长视野生成中的上下文感知推理

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313.pdf 原文地址&#xff1a;rat-retrieval-augmented-thoughts Github&#xff1a;Implementation of RAT 2024 年 3 月 14 日 介绍 让我首先从一些一般性观察开始...... 在生成式人工智能应用程序中实现效率与生成响应…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…

YOLOV9训练自己的数据集

1.代码下载地址GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 2.准备自己的数据集 这里数据集我以SAR数据集为例 具体的下载链接如下所示&#xff1a; 链接&#xff1a;https:/…

广州市高质量发展大会,东纺企服系统提出数智化新思路

近日&#xff0c;广州市海珠区凤阳街道高质量发展大会暨企业联盟沙龙荟在海珠区珠江国际纺织城D区6楼时尚馆召开。东纺科技作为海珠区企业代表&#xff0c;受邀出席参与活动。 本次大会对今年的高质量发展进行亮诺和展望。海珠区委常委、区纪委书记、区监委主任杨清谦以及海珠区…

【环境搭建和安装】thingsboard二次开发环境搭建

文章目录 1.安装JAVA2.安装maven环境3.安装nodeJS4.安装git环境5.安装npm依赖关系 提示&#xff1a; 1.我自己下载存放路径比较混乱&#xff0c;下载的文件尽量在一个新建的文件夹存放&#xff0c;目录全英更好。 2.环境是为了开源物联网平台&#xff0c;环境搭建和安装部署是成…

ETH网络 之 Gas花费实例

求关注&#xff0c;关注我&#xff0c;一起进入Web3的世界 前文回顾 GasBaseFee & PriorityFee部署ERC-721 交易Gas解析 部署NFT的交易 钱包Gas解读 费用清单 ItemValueDesc基础费用(BaseFee)0.102349622 Gwei基础费用是动态的&#xff0c;我们发送交易时是不确定的&…

想进阿里?先了解这个!@SpringMybatis注解面试解析

如有疑问或者更多的技术分享,欢迎关注我的微信公众号“知其然亦知其所以然”! 嗨,大家好!我是小米,今天要和大家聊一聊阿里巴巴面试题中的一个热门话题:@SpringMybatis注解。如果你是一个对技术充满好奇心的小伙伴,那么这篇文章一定会给你带来不少启发和收获! 在开始…

1、编写jsp文件,熟悉jsp页面的基本结构H编写看电影2、编写jsp文件,熟悉jsp动作标记、param传值的使用,计算机三角形的面积。

1、看电影 watchMovie.jsp: <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert ti…

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…

41 物体检测和目标检测数据集【李沐动手学深度学习v2课程笔记】

目录 1. 物体检测 2. 边缘框实现 3.数据集 4. 小结 1. 物体检测 2. 边缘框实现 %matplotlib inline import torch from d2l import torch as d2ld2l.set_figsize() img d2l.plt.imread(../img/catdog.jpg) d2l.plt.imshow(img);#save def box_corner_to_center(boxes):&q…

小白向软件开发教学实战:企业培训APP的设计与开发

随着信息技术的迅猛发展&#xff0c;软件开发已经成为了一个日益重要的技能。无论是个人还是企业&#xff0c;都希望能够掌握一定的软件开发能力&#xff0c;以满足自身的需求。尤其是在企业培训领域&#xff0c;定制化的软件应用能够提高培训效率和质量。 一、需求分析 在设计…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

#Linux(帮助手册)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;键入命令man man查看手册目录&#xff08;按q退出&#xff09; &#xff08;2&#xff09;查看手册需要先安装依赖包&#xff08;root权限安…

【spring】@ConditionalOnResource注解学习

ConditionalOnResource 介绍 ConditionalOnResource 是Spring框架中的一个条件化注解&#xff0c;它允许你根据类路径中是否存在指定的资源来决定是否加载特定的Bean定义或配置类。这个注解可以用于类级别或方法级别。 具体Conditional使用请看这篇文章【spring】Conditional…

【漏洞复现】4. Gitlab exiftool远程命令执行漏洞(CVE-2021-22205)复现与分析

文章目录 1. 预备知识2. 漏洞复现2.1 漏洞介绍2.1.1 简介2.1.2 事件过程 2.2 漏洞原理分析2.3 漏洞复现2.3.1 靶场搭建2.3.2 漏洞测试2.3.3 漏洞利用2.3.4 POC分析 2.4 漏洞修复 1. 预备知识 GitLab是一个基于Web的Git仓库管理工具&#xff0c;它提供了完整的DevOps平台&#x…

通俗理解自注意力机制

自注意力机制&#xff08;Self-Attention Mechanism&#xff09; 是一种用于处理序列数据的机制&#xff0c;最初被引入到神经网络模型中&#xff0c;用于在序列数据中建立全局依赖关系。自注意力机制最常用于自然语言处理和计算机视觉领域&#xff0c;特别是在Transformer模型…

机器学习 - 预测训练模型

接着上篇博客机器学习-训练模型做进一步说明。 There are three things to make predictions (also called performing inference) with a PyTorch model: Set the model in evaluation mode (model.eval())Make the predictions using the inference mode context manager (…

管理能力学习笔记一:角色转身

管理能力学习是为了解决角色转身后面临的更多更复杂的的问题。初晋管理层&#xff0c;需要转变工作习惯&#xff0c;学会分配时间。 角色转身 建立“授权”意识 通过匹配工作内容与下属员工能力&#xff0c;分配工作&#xff0c;避免陷入下属能力不足 -> 不愿授权 -> 下…

vue3通过el-cascader实现动态菜单切换页面

如果只有一级菜单只会显示一个按钮 <div style"width: 100%; margin-top: 10px; display: flex; align-items: center; border-bottom: 1px solid #ccc;"><template v-for"(menu, index) in cascaderData" :key"index"><el-casc…