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

news2024/12/30 2:09:20

🚀前言

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

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

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

🚀一、信息传递载体Want

🔎1.Want概述

🦋1.1 Want的定义与用途

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

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

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

image

🦋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匹配规则

image

image

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

image

image

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

image

image

image

☀️2.1.4 uri匹配规则

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

image

待匹配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匹配规则

image

🔎3.常见action与entities

🦋3.1 action

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

image

🦋3.2 entities

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

image

🔎4.使用显式Want启动Ability

1、启动方

新建callerAbility

image

2、被启动方

同理新建calleeAbility

image

3、启动方UI

import common from '@ohos.app.ability.common';
@Entry
@Component
struct 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、执行

image

🔎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",
        // ...
      }
      // ...
    ]
  },
]

image

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}`)
    }
 }

image

image

3、运行

image

🔎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}
            }
        }
    }
}

image

image

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

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus+Grafana监控服务器、mysql数据库并配置报警规则推送邮箱

文章目录 一、安装prometheus1.1下载1.2 安装1.3 开机启动1.4 验证 二、安装 Grafana2.1 下载2.2 安装2.3 启动2.4 验证 三、安装服务器监控 node_exporter3.1 下载3.2 安装3.3 设置 node_exporter 系统服务3.4 设置开机自动启动3.5 验证3.6配置Prometheus3.7 修改 Prometheus …

海外新闻媒体发稿,PR稿件海外投稿,国外软文宣发-需综合考虑发布平台/内容质量/SEO策略/目标受众/发布时间/效果监控以及媒体关系等多个方面

发布新闻稿是提升品牌知名度和影响力的重要手段。以下是一些在国外新闻稿发布的干货分享,帮助你更有效地进行海外PR发稿。 1. 选择合适的发布平台 选择一个合适的新闻稿发布平台是关键,不同的平台有不同的覆盖范围和目标受众。以下是一些推荐的平台&am…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承: Java支持多层继承: 反证法: Object类: Object类是java所有类的祖宗类,我们写的任…

HCIP-Datacom-ARST自选题库__ISIS判断【23道题】

1.IS-1S快速收敛是为了提高路由的收敛速度而做的扩展特性,包含PRC和I-SPF,其中PRC只对发生变化的路由进行重新计算,而I-SPF只对受影响的节点进行路由计算。√ 2.在I5-S协议视图下配置ipv6 preference,该命令的作用是配置|5-IS协议…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合,随机丢弃神经元 -----------------…

打包要求 minCompileSdk 使用指定版本及以上

我当前的 compileSdkVersion 30,因为依赖了 androidx.core:core:1.9.0 它要求最低 compileSdkVersion 33。 那么如果我不想升级 compileSdkVersion 应该怎么办? 答:当然是降低 core:core 版本! 看看谁依赖了这两个版本 android…

JavaSE——类和对象(二)~~封装

目录 一.封装 二.封装扩展之包 三.static成员 四. 代码块 五. 内部类(重要) 大家好呀,我是北纬,接着上节我们继续讲解Java中关于类和对象的相关知识,今天着重给大家介绍一下关于面向对象程序的特性之一——封装。…

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范; 2、符合ARINC818协议规范; 3、支持光纤通信Class1、Class3服务; 5、可动态配置光纤端口速率,支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置; 6、DDR控制接口简洁…

【01】全面理解JVM虚拟机

一、前言 学习JVM是进行JVM调优的基础。写的代码部署到线上它会如何运行?要配多少内存?线上环境出问题了,服务崩溃了,应该怎么快速定位?这些问题都与JVM有着一定的关系。好的程序员都应该尽自己的能力把JVM每个底层逻…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功,但是会发现图片、视频全是空的,如下图: 修改源代码,更换图片上传与保存地址 大概涉及到这些代码块,进行更改即可。…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

🎬️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}🎞️interface export interface IList{ti…

【zotero6】ZotCard笔记模板分享

zotcard插件下载链接:传送门 因为zotero出了新的zotero7,现在下载插件会出现zotero6和zotero7不兼容的情况,通过这个链接可以区分适配不同版本的插件。 下载后点击工具的附加组件 然后选择通过文件添加 就可以添加插件了 再通过 工具->…

第十三期Big Demo Day亮点项目:CCarbon重塑碳交易生态,助力全球绿色发展

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。我们荣幸地宣布,利用区块链技术优化全球碳交易CCarbon项目将亮相,参与精彩的项目路演。本次活动由ZeeprLabs、BiKing Exchange、Gather冠名赞助,Central Rese…

commvault学习(8):备份与恢复sql server

1.安装sql server2008r2 安装sql server 2.在客户端添加cv代理mssql server 如果此前的cv代理中没有sql server,那么可以手动再补充 点击setup 添加MSSQL Server 将程序添加到windows防火墙排除表 勾选自动探寻实例 3.备份sql server 3.1配置数据库内容 右击默…

HLS入门

一. HLS是什么?与VHDL/Verilog编程技术有什么关系? 高层次综合 (HLS) 抽象级别更高:HLS允许设计者在更高的抽象级别上工作,使用高级编程语言来描述硬件的功能。这种方法减少了设计者需要处理的底层细节,使得设计过程更加高效。…

下一代Docker会让部署更丝滑吗

下一代Docker会让部署更丝滑吗 如何通俗易懂的理解DockerDocker有什么缺点Docker与AI结合,会让部署更加丝滑吗 随着互联网技术的不断发展,单机系统已经无法满足日益正常的用户量以及正常处理用户请求,这个时候就需要进行多机部署,…

JDBC(Java DataBase Connectivity)Java数据库连接

JDBC(Java DataBase Connectivity) Java 语言连接数据库 再本模块中,java提供里一组用于连接数据库的类和接口Java 语言开发者,本身没有提供如何具体连接数据库的功能只是定义了一组java程序连接数据库的访问接口 连接到数据库向数据库发送增,修改,删除这一类的sql发送查询sq…

学习Thymeleaf时遇到的问题

使用idea创建web项目,启动服务器后无法访问页面 原因是tomcat 新版本引用包名改变 由javax变为jakarta 解决办法1 把项目的poe.xml文件由 改为 解决办法2 新建项目时选择新版本,但是新版本不支持thymeleaf

uniapp android使用uni.chooseLocation,app云打包后,定位地址列表一直在加载中

复现BUG 1、自己生成一个证书 参考生成证书流程 2、使用刚生成证书的SHA1 ,重新创建一个高德key 高德开放平台地址 3、打包(打包的包名要与高德申请key所填的包名一致)

从零搭建python环境:深入解析虚拟环境与Python版本管理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为何需要虚拟环境? 二、虚拟环境的创建与命名 1. 虚拟环境…