写点什么

鸿蒙 HarmonyOS 实战 -Stage 模型(信息传递载体 Want)

作者:EquatorCoco
  • 2024-05-25
    福建
  • 本文字数:3794 字

    阅读完需:约 12 分钟

🚀前言


应用中的信息传递是为了实现各种功能和交互。信息传递可以帮助用户和应用之间进行有效的沟通和交流。通过信息传递,应用可以向用户传递重要的消息、通知和提示,以提供及时的反馈和指导。同时,用户也可以通过信息传递向应用发送指令、请求和反馈,以实现个性化的需求和操作。


信息传递还可以帮助应用之间实现数据的共享和交互。通过信息传递,不同应用可以实现数据的互通,以实现更多的功能和服务。例如,一个购物应用可以通过信息传递与支付应用进行数据交互,以实现支付功能;一个社交媒体应用可以通过信息传递与地图应用进行数据交互,以实现位置分享功能。


此外,信息传递还可以帮助应用之间实现联动和协作。通过信息传递,应用可以实现多个功能的组合和协同,以提供更加丰富和综合的服务。例如,一个音乐应用可以与闹钟应用进行信息传递,以实现在特定时间播放特定的音乐。


🚀一、信息传递载体 Want


🔎1.Want 概述


🦋1.1 Want 的定义与用途


HarmonyOS 中的"Want"是一个用于定义和控制应用程序之间通信的基本概念。它可以用来描述一个应用程序对某个特定操作的需求或意愿,比如获取某个设备的位置信息、访问某个传感器的数据等。


使用"Want"可以实现应用程序之间的无缝协作和互操作。通过定义和使用"Wants",应用程序可以根据自身的需求发送请求,并且可以接收和处理其他应用程序发送的请求。这种机制能够促进应用程序之间的交互和共享,并且使得整个系统更加智能和高效。


"Wants"的使用可以带来许多好处。首先,它可以简化应用程序之间的通信和协作,减少开发人员的工作量。其次,它可以增强系统的灵活性和可扩展性,使得应用程序能够动态地适应不同的环境和设备。最后,它可以提供更加个性化和智能化的用户体验,使得应用程序能够更好地理解用户的需求并作出相应的反应。



🦋1.2 Want 的类型


在 HarmonyOS 中,信息传递载体 Want 的类型可以分为两种:显式 Want 和隐式 Want。


显式 Want:显式 Want 是指明确指定要操作的组件或服务的 Want。通过显式 Want,可以精确地指定要传递给目标组件或服务的信息,并指定具体的要执行的操作。显式 Want 会包含组件名和操作类型等明确的指令信息。例如,可以使用显式 Want 来启动指定的 Activity 或调用指定的服务。

let wantInfo = {    deviceId: '', // deviceId为空表示本设备    bundleName: 'com.example.myapplication',    abilityName: 'FuncAbility',}
复制代码


隐式 Want:隐式 Want 是指不明确指定要操作的组件或服务的 Want,而是根据一定的规则和条件来进行匹配。通过隐式 Want,可以实现组件之间的解耦和灵活性。隐式 Want 一般包含一组动作、类别、数据类型等条件,系统会根据这些条件来匹配合适的组件或服务。例如,可以使用隐式 Want 来处理某个特定类型的数据或根据某个特定的动作执行相应的操作。

let wantInfo = {    // uncomment line below if wish to implicitly query only in the specific bundle.    // bundleName: 'com.example.myapplication',    action: 'ohos.want.action.search',    // entities can be omitted    entities: [ 'entity.system.browsable' ],    uri: 'https://www.test.com:8080/query/student',    type: 'text/plain',};
复制代码


🔎2.显式 Want 与隐式 Want 匹配规则


🦋2.1 隐式 Want 匹配原理详解


系统将调用方传入的 want 参数(包含 action、entities、uri 和 type 属性)与已安装待匹配的应用 Ability 的 skills 配置(包含 actions、entities、uris 和 type 属性)依次进行匹配。当四个属性匹配均通过,则此应用才会被应用选择器展示给用户进行选择。


☀️2.1.1 want 参数的 action 匹配规则




☀️2.1.2 want 参数的 entities 匹配规则




☀️2.1.3 want 参数的 uri 和 type 匹配规则





☀️2.1.4 uri 匹配规则


以下是根据给定匹配规则展示的表格:



待匹配 Ability 的 skills 配置的 uris 中 scheme、host、port、path、pathStartWith 和 pathRegex 属性拼接,如果依次声明了 path、pathStartWith 和 pathRegex 属性时,uris 将分别拼接为如下三种表达式:


  • 全路径表达式:scheme://host:port/path

  • 前缀表达式:scheme://host:port/pathStartWith

  • 正则表达式:scheme://host:port/pathRegex


☀️2.1.5 type 匹配规则



🔎3.常见 action 与 entities


🦋3.1 action


表示调用方要执行的通用操作(如查看、分享、应用详情)



🦋3.2 entities


表示目标 Ability 的类别信息(如浏览器、视频播放器)



🔎4.使用显式 Want 启动 Ability


1、启动方


新建 callerAbility



2、被启动方


同理新建 calleeAbility



3、启动方 UI

import common from '@ohos.app.ability.common';@Entry@Componentstruct Index {  @State message: string = 'callerAbility'
build() { Row() { Column() { Text('hello') .fontSize(50) .fontWeight(FontWeight.Bold) // A new button with will call explicitStartAbility() when clicked. Button("CLICKME") .onClick(this.explicitStartAbility) // explicitStartAbility见下面示例代码 // ... } .width('100%') } .height('100%') } async explicitStartAbility() { try { // Explicit want with abilityName specified. let want = { deviceId: "", bundleName: "com.example.myapplication", abilityName: "calleeAbility" }; let context = getContext(this) as common.UIAbilityContext; await context.startAbility(want); console.info(`explicit start ability succeed`); } catch (error) { console.info(`explicit start ability failed with ${error.code}`); } }}
复制代码


4、执行



🔎5.使用隐式 Want 打开网址


1、module.json5 配置

"skills": [  {    "entities": [      "entity.system.browsable"      // ...    ],    "actions": [        "ohos.want.action.viewData"        // ...    ],    "uris": [      {        "scheme": "https",        "host": "www.test.com",        "port": "8080",        // prefix matching        "pathStartWith": "query",        "type": "text/*"      },      {        "scheme": "http",        // ...      }      // ...    ]  },]
复制代码



2、定义跳转函数

async implicitStartAbility() {    try {        let want = {            // uncomment line below if wish to implicitly query only in the specific bundle.            // bundleName: "com.example.myapplication",            "action": "ohos.want.action.viewData",            // entities can be omitted.            "entities": [ "entity.system.browsable" ],            "uri": "https://www.test.com:8080/query/student",            "type": "text/plain"        }        let context = getContext(this) as common.UIAbilityContext;        await context.startAbility(want)        console.info(`explicit start ability succeed`)    } catch (error) {        console.info(`explicit start ability failed with ${error.code}`)    } }
复制代码




3、运行



🔎6.应用间使用 Want 分享数据


1、分享方


读取文件

import fileIO from '@ohos.fileio';
// let path = ...// file open where path is a variable contains the file path.let fileFd = fileIO.openSync(path, 0o102, 0o666);
复制代码


传输文件信息构造

import wantConstant from '@ohos.ability.wantConstant';
// let path = ...// let fileFd = ...// let fileSize = ...let want = { // This action is used to implicitly match the application selctor. action: wantConstant.Action.ACTION_SELECT, // This is the custom parameter in the first layer of want // which is intended to add info to application selector. parameters: { // The MIME type of pdf "ability.picker.type": "application/pdf", "ability.picker.fileNames": [path], "ability.picker.fileSizes": [fileSize], // This a nested want which will be directly send to the user selected application. "ability.want.params.INTENT": { "action": "ohos.want.action.sendData", "type": "application/pdf", "parameters": { "keyFd": {"type": "FD", "value": fileFd} } } }}
复制代码




2、被分享方


定义 skills

"skills": [  {    "entities": [      // ...    ],    "actions": [        "ohos.want.action.sendData"        // ...    ],    "uris": [      {        "type": "application/pdf"      },      // ...    ]  },]
复制代码


2、接收数据

onCreate(want, launchParam) {  // note when keyFd is undefined, app crash will happen.  if (want["parameters"]["keyFd"] !== undefined) {    // receive file descriptor    let fd = want["parameters"]["keyFd"].value;    // ...  }}
复制代码


文章转载自:蜀道山QAQ

原文链接:https://www.cnblogs.com/shudaoshan/p/18211814

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)_鸿蒙_EquatorCoco_InfoQ写作社区