首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-22 03:40
  • 2660
  • 7310
blog.csdn.net

前言

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

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

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

一、信息传递载体Want

1.Want概述

?1.1 Want的定义与用途

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

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

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

在这里插入图片描述

?1.2 Want的类型

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

  1. 显式Want:显式Want是指明确指定要操作的组件或服务的Want。通过显式Want,可以精确地指定要传递给目标组件或服务的信息,并指定具体的要执行的操作。显式Want会包含组件名和操作类型等明确的指令信息。例如,可以使用显式Want来启动指定的Activity或调用指定的服务。
  1. let wantInfo = {
  2. deviceId: '', // deviceId为空表示本设备
  3. bundleName: 'com.example.myapplication',
  4. abilityName: 'FuncAbility',
  5. }
  1. 隐式Want:隐式Want是指不明确指定要操作的组件或服务的Want,而是根据一定的规则和条件来进行匹配。通过隐式Want,可以实现组件之间的解耦和灵活性。隐式Want一般包含一组动作、类别、数据类型等条件,系统会根据这些条件来匹配合适的组件或服务。例如,可以使用隐式Want来处理某个特定类型的数据或根据某个特定的动作执行相应的操作。
  1. let wantInfo = {
  2. // uncomment line below if wish to implicitly query only in the specific bundle.
  3. // bundleName: 'com.example.myapplication',
  4. action: 'ohos.want.action.search',
  5. // entities can be omitted
  6. entities: [ 'entity.system.browsable' ],
  7. uri: 'https://www.test.com:8080/query/student',
  8. type: 'text/plain',
  9. };

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

?2.1 隐式Want匹配原理详解

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

☀️2.1.1 want参数的action匹配规则
调用方传入的want参数的action待匹配Ability的skills配置中的actions匹配结果
为空为空匹配失败
不为空为空匹配失败
为空不为空匹配成功
不为空包含调用方传入的action匹配成功
不为空不包含调用方传入的action匹配失败

在这里插入图片描述

☀️2.1.2 want参数的entities匹配规则
want参数的entities待匹配Ability的skills配置的entities匹配结果
为空不为空成功
为空为空成功
不为空为空失败
不为空包含调用方传入的entities成功
不为空不完全包含调用方传入的entities失败

在这里插入图片描述

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

在这里插入图片描述

调用方传入的want参数待匹配Ability的skills配置中的uris数组匹配结果
uri为空,type为空uris为空匹配成功
uri为空,type为空uris存在uri的scheme和type都为空的元素匹配成功
uri为空,type为空其他情况匹配失败
uri不为空,type为空uris为空匹配失败
uri不为空,type为空uris存在一条数据uri匹配成功且type为空匹配成功
uri为空,type不为空uris为空匹配失败
uri为空,type不为空uris存在一条数据uri的scheme为空且type匹配成功匹配成功
uri不为空,type不为空uris为空匹配失败
uri不为空,type不为空uris存在一条数据uri匹配和type匹配需要均匹配成功匹配成功
uri不为空,type不为空其他情况匹配失败

在这里插入图片描述

☀️2.1.4 uri匹配规则

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

s_uri.schemes_uri.hosts_uri.paths_uri.pathStartWiths_uri.pathRegexw_uri匹配结果
abc://def成功
失败
abc://defabc://def成功
abc://defdef://abc失败
/path/path成功
/path/path/123失败
/pathStart/pathStart成功
/pathStart/pathStart2失败
^/regex$/regex成功
^/regex$/path/regex失败
abc://def/pathabc://def/path成功
abc://def/pathabc://def/path/123失败
/pathStart/pathStart2/test失败
^/regex$/path/regex/test失败

待匹配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匹配规则
Ability Skills Regex匹配规则w_type匹配规则匹配结果
s_type为空任意失败
s_type为通配符"/"任意成功
s_type为通配符"prefixType/*"含有"prefixType/"成功
s_type为通配符"prefixType/*"不含有"prefixType/"失败
w_type为通配符"/"任意成功
w_type为通配符"prefixType/*"含有"prefixType/"成功
w_type为通配符"prefixType/*"不含有"prefixType/"失败

3.常见action与entities

?3.1 action

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

Action(动作)描述
ACTION_HOME启动应用入口组件的动作,需要和ENTITY_HOME配合使用;系统桌面应用图标就是显式的入口组件,点击也是启动入口组件;入口组件可以配置多个。
ACTION_CHOOSE选择本地资源数据,例如联系人、相册等;系统一般对不同类型的数据有对应的Picker应用,例如联系人和图库。
ACTION_VIEW_DATA查看数据,当使用网址uri时,则表示显示该网址对应的内容。
ACTION_VIEW_MULTIPLE_DATA发送多个数据记录的操作。

?3.2 entities

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

类别名称描述
ENTITY_DEFAULT默认类别,没有实际意义。
ENTITY_HOME主屏幕有图标点击入口类别。
ENTITY_BROWSABLE指示浏览器类别。

4.使用显式Want启动Ability

1、启动方

新建callerAbility
在这里插入图片描述

2、被启动方

同理新建calleeAbility
在这里插入图片描述
3、启动方UI

  1. import common from '@ohos.app.ability.common';
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State message: string = 'callerAbility'
  6. build() {
  7. Row() {
  8. Column() {
  9. Text('hello')
  10. .fontSize(50)
  11. .fontWeight(FontWeight.Bold)
  12. // A new button with will call explicitStartAbility() when clicked.
  13. Button("CLICKME")
  14. .onClick(this.explicitStartAbility) // explicitStartAbility见下面示例代码
  15. // ...
  16. }
  17. .width('100%')
  18. }
  19. .height('100%')
  20. }
  21. async explicitStartAbility() {
  22. try {
  23. // Explicit want with abilityName specified.
  24. let want = {
  25. deviceId: "",
  26. bundleName: "com.example.myapplication",
  27. abilityName: "calleeAbility"
  28. };
  29. let context = getContext(this) as common.UIAbilityContext;
  30. await context.startAbility(want);
  31. console.info(`explicit start ability succeed`);
  32. } catch (error) {
  33. console.info(`explicit start ability failed with ${error.code}`);
  34. }
  35. }
  36. }

4、执行

在这里插入图片描述

5.使用隐式Want打开网址

1、module.json5配置

  1. "skills": [
  2. {
  3. "entities": [
  4. "entity.system.browsable"
  5. // ...
  6. ],
  7. "actions": [
  8. "ohos.want.action.viewData"
  9. // ...
  10. ],
  11. "uris": [
  12. {
  13. "scheme": "https",
  14. "host": "www.test.com",
  15. "port": "8080",
  16. // prefix matching
  17. "pathStartWith": "query",
  18. "type": "text/*"
  19. },
  20. {
  21. "scheme": "http",
  22. // ...
  23. }
  24. // ...
  25. ]
  26. },
  27. ]

在这里插入图片描述

2、定义跳转函数

  1. async implicitStartAbility() {
  2. try {
  3. let want = {
  4. // uncomment line below if wish to implicitly query only in the specific bundle.
  5. // bundleName: "com.example.myapplication",
  6. "action": "ohos.want.action.viewData",
  7. // entities can be omitted.
  8. "entities": [ "entity.system.browsable" ],
  9. "uri": "https://www.test.com:8080/query/student",
  10. "type": "text/plain"
  11. }
  12. let context = getContext(this) as common.UIAbilityContext;
  13. await context.startAbility(want)
  14. console.info(`explicit start ability succeed`)
  15. } catch (error) {
  16. console.info(`explicit start ability failed with ${error.code}`)
  17. }
  18. }
匹配条件匹配结果
want内action不为空,且被skills内action包括匹配成功
want内entities不为空,且被skills内entities包括匹配成功
skills内uris拼接为https://www.test.com:8080/query* ( *为通配符)包含want内uri,匹配成功
want内type不为空,且被skills内type包含匹配成功

在这里插入图片描述
3、运行

在这里插入图片描述

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

1、分享方

读取文件

  1. import fileIO from '@ohos.fileio';
  2. // let path = ...
  3. // file open where path is a variable contains the file path.
  4. let fileFd = fileIO.openSync(path, 0o102, 0o666);

传输文件信息构造

  1. import wantConstant from '@ohos.ability.wantConstant';
  2. // let path = ...
  3. // let fileFd = ...
  4. // let fileSize = ...
  5. let want = {
  6. // This action is used to implicitly match the application selctor.
  7. action: wantConstant.Action.ACTION_SELECT,
  8. // This is the custom parameter in the first layer of want
  9. // which is intended to add info to application selector.
  10. parameters: {
  11. // The MIME type of pdf
  12. "ability.picker.type": "application/pdf",
  13. "ability.picker.fileNames": [path],
  14. "ability.picker.fileSizes": [fileSize],
  15. // This a nested want which will be directly send to the user selected application.
  16. "ability.want.params.INTENT": {
  17. "action": "ohos.want.action.sendData",
  18. "type": "application/pdf",
  19. "parameters": {
  20. "keyFd": {"type": "FD", "value": fileFd}
  21. }
  22. }
  23. }
  24. }
字段说明
ability.picker.type应用选择器根据该字段渲染相应的文件类型图标
ability.picker.fileNames应用选择器根据该字段展示文件名
ability.picker.fileSizes应用选择器根据该字段展示文件大小。以字节为单位
ability.picker.fileNames[]文件名数组,与ability.picker.fileSizes[]有一一对应的关系
ability.picker.fileSizes[]文件大小数组,与ability.picker.fileNames[]有一一对应的关系

在这里插入图片描述

2、被分享方

定义skills

  1. "skills": [
  2. {
  3. "entities": [
  4. // ...
  5. ],
  6. "actions": [
  7. "ohos.want.action.sendData"
  8. // ...
  9. ],
  10. "uris": [
  11. {
  12. "type": "application/pdf"
  13. },
  14. // ...
  15. ]
  16. },
  17. ]

2、接收数据

  1. onCreate(want, launchParam) {
  2. // note when keyFd is undefined, app crash will happen.
  3. if (want["parameters"]["keyFd"] !== undefined) {
  4. // receive file descriptor
  5. let fd = want["parameters"]["keyFd"].value;
  6. // ...
  7. }
  8. }

 ?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→全套鸿蒙HarmonyOS学习资料
  • 或者关注小编后私信回复【666】也可获取资料哦~~

最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135490733"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top