HarmonyOS元服务与卡片

news/2024/9/19 9:12:00 标签: harmonyos, 华为

元服务与卡片

文章目录

  • 一、元服务
    • 1.介绍
    • 2.常见元服务项目步骤
  • 二、卡片
    • 1.介绍
    • 2.卡片的创建
    • 3.卡片的数据的变更
    • 4.卡片的进程间通讯
      • 4.1使用工具包
      • 4.2使用步骤
    • 5.卡片路由postCardAction:快速拉起后台
      • 5.1格式
      • 5.2快速拉起指定页面--router
      • 5.3调用后台功能--call
      • 5.3卡片内的数据获取(适合轻量级,限制在5s内)--message

一、元服务

1.介绍

元服务就是手机中自带的小组件类似。
是一种有独立入口、免安装、可为用户提供一个或多个服务的新型应用程序形态。它基于 HarmonyOS API 开发,支持运行在 “1+8+N” 设备上,让用户在合适的场景、合适的设备上便捷使用。
特点: 
1.免下载安装:用户无需像传统应用那样经历下载、安装等繁琐过程,节省了设备存储空间和下载时间,能够快速使用服务。例如,用户在使用一些简单功能的应用服务时,无需等待下载安装,直接通过元服务即可快速获取相关功能。
2.即开即用、即用即走:使用非常便捷,用户在需要时可以快速打开使用,使用完毕后不需要专门去关闭或卸载,减少了操作步骤和使用负担。比如用户在查询某个信息时,通过元服务快速查询到结果后即可关闭,下次使用时再次快速打开。
3.多端部署:只需一次开发,就可以部署在各种 HarmonyOS 终端上,包括手机、平板、智能手表、智慧屏等,大大降低了开发者的开发成本和工作量,同时也为用户提供了跨设备的一致使用体验。
4.使用方式与入口:
用户可以通过负一屏、智慧搜索、小艺助手等入口唤起元服务。例如,在负一屏中搜索相关的元服务名称,或者通过语音指令让小艺助手打开相应的元服务。
元服务还可以以服务卡片的形式存在于用户的设备桌面,用户可以根据自己的需求添加、管理和使用服务卡片,方便快捷地获取服务信息和进行操作。
对开发者的优势:
5.开发相对简单,开发者可以快速加入鸿蒙生态。并且元服务代码 100% 可复用到原生应用开发,提高了开发效率和代码的复用性。
通过鸿蒙系统的服务分发能力,元服务可以获得更多的流量和曝光机会,有助于开发者的服务更好地推广和被用户使用。
总之,元服务是 HarmonyOS 生态中的一个重要组成部分,为用户提供了更加便捷、高效的服务体验,也为开发者提供了新的开发和推广机会。

2.常见元服务项目步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、卡片

1.介绍

元服务与卡片开发之间的关联主要体现在:卡片作为元服务的展现形式之一,可以为用户提供与元服务交互的界面。通过卡片,用户可以方便地访问和控制后台的元服务,而开发者则可以利用元服务为卡片提供丰富的功能和数据。这种设计允许鸿蒙操作系统在不同设备上提供一致且高效的用户体验,同时也简化了跨设备服务的开发和维护。

总的来说,元服务和卡片开发是鸿蒙操作系统中支持分布式能力和提高用户体验的两个关键技术。通过元服务,鸿蒙能够在多种设备之间提供无缝的服务体验;而卡片开发则使得这些服务能够以一种简洁而直观的方式呈现给用户,从而促进了不同设备和场景下的信息流通和功能使用。

2.卡片的创建

元服务和普通项目都一致,项目的文件夹可以变更

在这里插入图片描述

3.卡片的数据的变更

使用的工具包,可以见首选项工具包:PreferencesUtil,主要用于存放卡片ID

思路:根据ID
1.在EntryFormAbility中获取卡片ID:
2.在特定位置触发,用于加载卡片显示的数据
3. 卡片接收方式: @LocalStorageProp(“title”) // 使用页面级别Ui接收

 1.在EntryFormAbility中获取卡片ID:
 
 private preference: PreferencesUtil = PreferencesUtil.getInstance()
  onAddForm(want: Want) { // 请求不能超出5秒,否则自动断开
    // 正常业务使用的情况 -- 进保存卡片ID,存在问题:有变更则所有的都变更 ---优化增加卡片name保存到首选项
    let formData = {
      "title": "加载中..."
    } as Record<string, string>;
    
    // 业务处理和返回无关
    // 获取卡片ID
    let id = want.parameters![formInfo.FormParam.IDENTITY_KEY]  
    // 获取卡片name // 可以根据name过滤非同一类的卡片,做到指定更新
    let name = want.parameters![formInfo.FormParam.NAME_KEY]  
    console.log('system===>卡片ID:' + id+'卡片name:'+name)
    // 首选项封装的工具,将ID,name保存至首选项
    this.preference.addFormId(this.context, JSON.stringify({"id":id,"name":name}))
      .then((res) => {
        console.log('system===>添加')
      })
      .catch(() => {
        console.error('system===>错误')
      })
    return formBindingData.createFormBindingData(formData);
  }
 2.在特定位置触发,用于加载卡片显示的数据。
 以根据卡片名称,指定更新为例:

// 封装方法
  getForm(formName: string) { // 传递的卡片的名称
  // 根据首选项,获取所有的卡片ID
    this.preference.getFormIds(getContext(this)).then((item) => { // 返回JSON数组
    // 所要变更的成的数据
      let formData = {
        "title": "卡片延时加载" + formName
      } as Record<string, string>;
      
      // 获取索要的卡片ID
      const arr = item.filter((formDataS) => {
        const obj: Record<string,string|number> = JSON.parse(formDataS) as Record<string,string|number>
        console.log('system===>'+JSON.parse(formDataS)+':'+obj.name)
        return obj.name == formName
      })
      if (arr.length > 0) {
        arr.forEach((son: string) => {
          const obj: Record<string,string|number> = JSON.parse(son) as Record<string,string|number>

         // 执行卡片ID,将数据变更
          formProvider.updateForm(obj.id as string, formBindingData.createFormBindingData(formData))
          // 执行固定函数
          formBindingData.createFormBindingData(formData);
        })
      }
    }).catch((err: BusinessError) => {
      console.error('system===>更新' + JSON.stringify(err))
    })
  }

3. 卡片接收数据方式:   @LocalStorageProp("title") // 使用页面级别Ui接收

  @LocalStorageProp("title") // 使用页面级别Ui接收
  readonly TITLE: string = '';
  build() {
    Row() {
      Column() {
        Text(this.TITLE)
          .fontSize($r('app.float.font_size'))
          .fontWeight(FontWeight.Medium)
          .fontColor($r('app.color.item_title_font'))
      }
    }
  }

4.卡片的进程间通讯

卡片的加载数据与APP应用不是同一个进程,可能回导致数据刷新不到,此时需要进程间的通讯(发布和订阅)–进程间通信(IPC)的订阅-发布模式实现。
发布: 谁触发
订阅: 根据获取的ID指定更新

4.1使用工具包

import commonEventManager from '@ohos.commonEventManager'
import { BusinessError } from '@kit.BasicServicesKit';
import { JSON } from '@kit.ArkTS';


// Publisher通讯事件类型
enum PublishEventType {
  APP_PUBLISH = "APP_PUBLISH",
  CARD_PUBLISH = "CARD_PUBLISH"
}


class IPCManagerClass {
  static publishCount:number = 1
  // 发布者
  static publish(eventType:PublishEventType,data:string){
    // commonEventManager作用:可用于进程间通讯
    commonEventManager.publish(eventType,{data},(err)=>{
      if(err){
        console.log('hmlog-->',`IPCManagerClass,publish formId:${data} Failed.Err:`+JSON.stringify(err))
        // 失败只发3次
        if(IPCManagerClass.publishCount<3){
          IPCManagerClass.publishCount ++;
          IPCManagerClass.publish(eventType,data);
        }
      }else{
        IPCManagerClass.publishCount = 1
        console.log('hmlog-->',`IPCManagerClass,publish formId:${data} Successed.`)
      }
    })
  }
  // 订阅者
  static subscribe(eventType:PublishEventType,subscriber?:commonEventManager.CommonEventSubscriber,callback?:(event:string)=>void){
    commonEventManager.createSubscriber({ events: [eventType] }, (err, data) => {
      if (err) {
        return console.log('hmlog-->', `IPCManagerClass,subscribe,创建订阅者error ${JSON.stringify(err)}`)
      }
      console.log('hmlog-->', `IPCManagerClass,subscribe,创建订阅者success`)
      subscriber = data
      if (subscriber !== null) {
        //订阅事件
        commonEventManager.subscribe(subscriber, (err:BusinessError, data:commonEventManager.CommonEventData) => {
          if (err) {
            return console.error(`hmlog-->`, 'IPCManagerClass,subscribe,订阅事件失败')
          }
          console.log('hmlog-->',`IPCManagerClass,subscribe,接收订阅:收到发布者传送过来数据,formId:${data.data}`)
          callback!(data.data!)
        })
      } else {
        console.error('hmlog-->',`IPCManagerClass,subscribe,需要创建subscriber`);
      }
    })
  }
}

export {IPCManagerClass,PublishEventType}

4.2使用步骤

5.卡片路由postCardAction:快速拉起后台

5.1格式

postCardAction(this, {
              action: 'router', // 三种方式: router:拉起后台 /call:拉起后台 /message 卡片内的数据获取,受限大
              abilityName: 'EntryAbility', // app的启动UiAbility
              // 参数
              params: {
                // 传参JSON格式
                message: '跳转B成功'
              }
            });


 // 接收参数的方式:APP的EntryAbility文件中: let params = JSON.parse(want.parameters!.params as string) as Record<string, string>;
const message = params.message;

5.2快速拉起指定页面–router

思路:
在EntryAbility 定义变量用于接收路径path 和 windowStage
当用于被隐藏第二次不会再次调用onWindowStageCreate和onCreate 则需要使用 使用 onNewWant 并在调用时,重新调用onWindowStageCreate

5.3调用后台功能–call

5.3卡片内的数据获取(适合轻量级,限制在5s内)–message


http://www.niftyadmin.cn/n/5665316.html

相关文章

总结拓展十:SAP开发计划(上)

第一节 功能开发说明书介绍 1、功能开发的基础分类 报表查询开发单据打印开发功能开发增强开发接口开发 2、屏幕元素介绍 ——程序屏幕是SAP系统与用户之间的桥梁&#xff0c;屏幕由各种不同元素布局组成 示例&#xff1a;选择屏幕界面 单选输入框 多选输入框 设定默认…

MySQL高阶1783-大满贯数量

题目 找出每一个球员赢得大满贯比赛的次数。结果不包含没有赢得比赛的球员的ID 。 结果集 无顺序要求 。 准备数据 Create table If Not Exists Players (player_id int, player_name varchar(20)); Create table If Not Exists Championships (year int, Wimbledon int, F…

『 Linux 』HTTP(一)

文章目录 域名URLURLEncode和URLDecodeHTTP的请求HTTP的响应请求与响应的获取简单的Web服务器 域名 任何客户端在需要访问一个服务端时都需要一个IP和端口号,而当一个浏览器去访问一个网页时通常更多使用的是域名而不是IP:port的方式, www.baidu.com这是百度的域名; 实际上当浏…

Scikit-learn 学习笔记

安装&#xff1a; 在Scikit-learn中&#xff0c;数据通常表示为NumPy数组或Pandas DataFrame。特征数据&#xff08;X&#xff09;通常是一个二维数组&#xff0c;其中每一行代表一个样本&#xff0c;每一列代表一个特征。目标数据&#xff08;y&#xff09;通常是一个一维数组…

【编程底层原理】Java对象头的详细结构、锁机制及其优化技术,以及逃逸分析和JIT技术在性能优化中的作用

本文的内容主要涉及Java虚拟机&#xff08;JVM&#xff09;的内存管理、对象头的组成、锁机制和优化技术。 1. 对象头的组成 Mark Word&#xff1a;存储对象的运行时数据&#xff0c;如哈希码&#xff08;HashCode&#xff09;、GC分代年龄、锁状态标志、线程持有的锁、偏向线…

Docker安装 ▎Docker详细讲解 ▎数据卷挂载 ▎Nginx安装理解

前言 Docker是一种容器化技术&#xff0c;简化软件的部署和管理。文章详细解释了Docker的架构、安装步骤和常用命令&#xff0c;帮助用户快速启动和管理容器。还介绍了Docker镜像命令和数据卷挂载的实例&#xff0c;增强对持久化存储的理解&#xff0c;并涵盖了Nginx的安装方法…

Imagen与其他生成模型的对比:DALL-E、Stable Diffusion、MidJourney

Imagen与其他生成模型的对比&#xff1a;DALL-E、Stable Diffusion、MidJourney 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;在艺术创作、文本生成、图像生成等领域取得了显著的进展。以生成图像为例&#xff0c;Imagen、DALL-E、Stable Diffusio…

ssh远程连接try1账号切换tips

1&#xff0c;创建拥有sudo权限的用户&#xff1a; 在root下 sudo adduser bio sudo vim /etc/sudoers //修改添加如下&#xff1a; bio ALL(ALL) ALL //bio用户就拥有了root权限参考&#xff1a;https://github.com/isLishude/blog/issues/70 2&#xff0c;修改ssh配置 …