HarmonyOS4.0系统性深入开发10卡片事件能力说明

卡片事件能力说明

ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。

点击放大

接口定义:postCardAction(component: Object, action: Object): void

接口参数说明:

参数名参数类型必填参数描述
componentObject当前自定义组件的实例,通常传入this。
actionObjectaction的具体描述,详情见下表。

action参数说明:

KeyValue样例描述
“action”stringaction的类型,支持三种预定义的类型:“router”:跳转到提供方应用的指定UIAbility。“message”:自定义消息。触发后会调用提供方FormExtensionAbility的onFormEvent()生命周期回调。“call”:后台启动提供方应用。触发后会拉起提供方应用的指定UIAbility(仅支持launchType为singleton的UIAbility,即启动模式为单实例的UIAbility),但不会调度到前台。提供方应用需要具备后台运行权限(ohos.permission.KEEP_BACKGROUND_RUNNING)。
“bundleName”string“router” / “call” 类型时跳转的包名,可选。
“moduleName”string“router” / “call” 类型时跳转的模块名,可选。
“abilityName”string“router” / “call” 类型时跳转的UIAbility名,必填。
“params”Object当前action携带的额外参数,内容使用JSON格式的键值对形式。"call"类型时需填入参数’method’,且类型需要为string类型,用于触发UIAbility中对应的方法,必填。

postCardAction()接口示例代码:

Button('跳转').width('40%').height('20%').onClick(() => {postCardAction(this, {'action': 'router','bundleName': 'com.example.myapplication','abilityName': 'EntryAbility','params': {'message': 'testForRouter' // 自定义要发送的message}});})
Button('拉至后台').width('40%').height('20%').onClick(() => {postCardAction(this, {'action': 'call','bundleName': 'com.example.myapplication','abilityName': 'EntryAbility','params': {'method': 'fun', // 自定义调用的方法名,必填'message': 'testForCall' // 自定义要发送的message}});})

使用router事件跳转到指定UIAbility

在卡片中使用postCardAction接口的router能力,能够快速拉起卡片提供方应用的指定UIAbility,因此UIAbility较多的应用往往会通过卡片提供不同的跳转按钮,实现一键直达的效果。例如相机卡片,卡片上提供拍照、录像等按钮,点击不同按钮将拉起相机应用的不同UIAbility,从而提升用户的体验。

img

通常使用按钮控件来实现页面拉起,示例代码如下:

  • 在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送router事件,并在事件内定义需要传递的内容。

    @Entry
    @Component
    struct WidgetCard {build() {Column() {Button('功能A').margin('20%').onClick(() => {console.info('Jump to EntryAbility funA');postCardAction(this, {'action': 'router','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'targetPage': 'funA' // 在EntryAbility中处理这个信息}});})Button('功能B').margin('20%').onClick(() => {console.info('Jump to EntryAbility funB');postCardAction(this, {'action': 'router','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'targetPage': 'funB' // 在EntryAbility中处理这个信息}});})}.width('100%').height('100%')}
    }
    
  • 在UIAbility中接收router事件并获取参数,根据传递的params不同,选择拉起不同的页面。

    import UIAbility from '@ohos.app.ability.UIAbility';
    import window from '@ohos.window';let selectPage = "";
    let currentWindowStage = null;export default class CameraAbility extends UIAbility {// 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调onCreate(want, launchParam) {// 获取router事件中传递的targetPage参数console.info("onCreate want:" + JSON.stringify(want));if (want.parameters.params !== undefined) {let params = JSON.parse(want.parameters.params);console.info("onCreate router targetPage:" + params.targetPage);selectPage = params.targetPage;}}// 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调onNewWant(want, launchParam) {console.info("onNewWant want:" + JSON.stringify(want));if (want.parameters.params !== undefined) {let params = JSON.parse(want.parameters.params);console.info("onNewWant router targetPage:" + params.targetPage);selectPage = params.targetPage;}if (currentWindowStage != null) {this.onWindowStageCreate(currentWindowStage);}}onWindowStageCreate(windowStage: window.WindowStage) {let targetPage;// 根据传递的targetPage不同,选择拉起不同的页面switch (selectPage) {case 'funA':targetPage = 'pages/FunA';break;case 'funB':targetPage = 'pages/FunB';break;default:targetPage = 'pages/Index';}if (currentWindowStage === null) {currentWindowStage = windowStage;}windowStage.loadContent(targetPage, (err, data) => {if (err && err.code) {console.info('Failed to load the content. Cause: %{public}s', JSON.stringify(err));return;}});}
    };
    

使用call事件拉起指定UIAbility到后台

许多应用希望借助卡片的能力,实现和应用在前台时相同的功能。例如音乐卡片,卡片上提供播放、暂停等按钮,点击不同按钮将触发音乐应用的不同功能,进而提高用户的体验。在卡片中使用postCardAction接口的call能力,能够将卡片提供方应用的指定UIAbility拉到后台。同时,call能力提供了调用应用指定方法、传递数据的功能,使应用在后台运行时可以通过卡片上的按钮执行不同的功能。

通常使用按钮控件来触发call事件,示例代码如下:

  • 在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送call事件,并在事件内定义需要调用的方法和传递的数据。需要注意的是,method参数为必选参数,且类型需要为string类型,用于触发UIAbility中对应的方法。

    @Entry
    @Component
    struct WidgetCard {build() {Column() {Button('功能A').margin('20%').onClick(() => {console.info('call EntryAbility funA');postCardAction(this, {'action': 'call','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'method': 'funA' // 在EntryAbility中调用的方法名}});})Button('功能B').margin('20%').onClick(() => {console.info('call EntryAbility funB');postCardAction(this, {'action': 'call','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'method': 'funB', // 在EntryAbility中调用的方法名'num': 1 // 需要传递的其他参数}});})}.width('100%').height('100%')}
    }
    
  • 在UIAbility中接收call事件并获取参数,根据传递的method不同,执行不同的方法。其余数据可以通过readString的方式获取。需要注意的是,UIAbility需要onCreate生命周期中监听所需的方法。

    import UIAbility from '@ohos.app.ability.UIAbility';function FunACall(data) {// 获取call事件中传递的所有参数console.log('FunACall param:' + JSON.stringify(data.readString()));return null;
    }function FunBCall(data) {console.log('FunACall param:' + JSON.stringify(data.readString()));return null;
    }export default class CameraAbility extends UIAbility {// 如果UIAbility第一次启动,在收到call事件后会触发onCreate生命周期回调onCreate(want, launchParam) {try {// 监听call事件所需的方法this.callee.on('funA', FunACall);this.callee.on('funB', FunBCall);} catch (error) {console.log('register failed with error. Cause: ' + JSON.stringify(error));}}// 进程退出时,解除监听onDestroy() {try {this.callee.off('funA');this.callee.off('funB');} catch (error) {console.log('register failed with error. Cause: ' + JSON.stringify(error));}}
    };
    

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

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

相关文章

建模杂谈系列236 Block Manager

说明 很久没有写了,总是写一半就没空往下写。这次正好有个单独的主题,可以写一下。 内容 1 块的分配 数据应该怎么切分和管理?这没有一个固定的答案,在我的实践中,我觉得一个块(Block)一万条记录是比较合理的。然后…

Android App从备案到上架全过程

不知道大家注意没有,最近几年来,新的移动App想要上架是会非常困难的,并且对于个人开发者和小企业几乎是难如登天,各种备案和审核。但是到底有多难,或许只有上架过的才会有所体会。 首先是目前各大应用市场陆续推出新的声明,各种备案截止日期到12月就要到最后期限责令整改…

docker实战:安装redis

目录 1、查看可用的版本2、拉取最新版的镜像3、查看本地镜像4、运行容器5、测试redis 服务6、清理容器 1、查看可用的版本 使用 docker search命令可以查看容器的可用版本,使用–limit可以设置输出的结果数量 [rootlocalhost docker]# docker search redis NAME …

文本分类应用到工作实践

日常工作中会用到文本分类,如果量比较少人工分类一下也可实现,但是准确率不是很高。如果量多就需要用到NLP相关功能。直接上代码实践。 运行环境:python3 paddlepaddle2.5.0 加载数据集 # 加载当前数据集 cd /home/aistudio/data/data238254/安装组件 # 安装组件 pip ins…

Debezium发布历史41

原文地址: https://debezium.io/blog/2018/10/04/debezium-0-9-0-alpha2-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 0.9.0.Alpha2 发布 2018 年 10 月 4 日 作者&#xff1a…

191.【2023年华为OD机试真题(C卷)】亲子游戏(DFS和BFS—JavaPythonC++JS实现)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【2023年华为OD机试真题(C卷)】亲子游戏(DFS和BFS—…

Python使用余弦相似度比较两个图片

为了使用余弦相似度来找到与样例图片相似的图片,我们需要先进行一些预处理,然后计算每两张图片之间的余弦相似度。以下是一个简单的实现: 读取样例图片和目标文件夹中的所有图片。对每张图片进行预处理,例如灰度化、降噪等。计算…

『OPEN3D』1.12 RGBD三维重建

目录 一、流程准备 1、数据集准备 2、重建参数配置 3、代码运行 二、代码解析</

shell case判断的实际应用

简介 case语句是一种多路分支结构&#xff0c;用于根据变量的值来判断执行不同的命令。作用与 if 有着异曲同工之妙&#xff0c;在某些地方比 if 可能更加好用&#xff0c;这里就介绍一些 case 的用法与实践&#xff0c;if 的详细方法见另一篇文章&#xff1a;shell if判断的应…

我的机器学习起步如何Getting Started

学习技巧和原则 先通过经典书籍进行科普知名机器学习网站根据书籍或网站的目录&#xff0c;先泛读、再选择有兴趣的部分重点精读、后至于反复读知行合一 起步Getting Started 周志华版《机器学习》&#xff0c;又名西瓜书 可以作为科普书籍&#xff0c;需要主动略过对于理论…

27、web攻防——通用漏洞SQL注入Tamper脚本Base64Jsonmd5

文章目录 数字型&#xff1a;0-9。http;//localhost:8081/blog/news.php?id1 字符型&#xff1a;a-z、中文&#xff0c;需要闭合符号。http;//localhost:8081/blog/news.php?idsimple 搜索型&#xff1a;在字符型的基础上加入了通配符%。http;//localhost:8081/blog/news.…

问界M9激光雷达解说

什么是激光雷达 激光雷达(英文:Lidar),是一种通过发射激光束来测量目标位置、速度等特征量的雷达系统。其工作原理是将激光光束照射到目标物体上,然后通过测量激光光束从发射到反射回来的时间,来计算目标物体的距离、位置、速度等参数。激光雷达通常用于测量地形、地貌、…

js常用事件演示

为什么要使用js事件&#xff1a; JavaScript事件是非常重要的&#xff0c;因为它们提供了与用户交互和处理用户操作的能力。以下是一些使用JavaScript事件的原因&#xff1a; 交互性&#xff1a;使用JavaScript事件可以实现各种交互功能&#xff0c;例如点击按钮、移动鼠标、按…

考研用什么光源比较好?五款好用台灯推荐

人眼对光是非常敏感的&#xff0c;特别是儿童青少年眼睛还在发育的状态来说&#xff0c;光线是至关重要的&#xff0c;于是这次测评就不能马虎&#xff0c;必须要本着专业严谨的态度进行测评&#xff0c;这次测评呢就花了不少钱买下了现在市面上热度很高、或是较有名气的专业款…

超维空间S2无人机使用说明书——53、进阶版——添加滤波后使用PID算法进行基于yolo的目标跟踪

引言&#xff1a;为了提高识别效果&#xff0c;采用递推均值滤波的算法对图像返回的识别准确度和位置信息进行处理&#xff0c;在实际应用过程中有着不错的表现。本小节内容是在52小节的基础上进行优化&#xff0c;可以先参考52小节&#xff0c;在此基础上再参考此处代码即可。…

LeetCode刷题--- 第 N 个泰波那契数

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

男女婚姻配对中若男孩有金钱和长相帅气是容易成功的因素分析

男女婚姻配对中若男孩有金钱和长相帅气是容易成功的因素分析。 男人想要脱离单身主要考虑哪些因素、提升哪些方面。 首先&#xff0c;你要清楚&#xff0c;女人喜欢什么&#xff0c;你和她能长久在一起的概率是多少&#xff1f; 直白的说&#xff0c;女人&#xff0c;就是喜欢…

算法通关村第二十关-黄金挑战图的常见算法

大家好我是苏麟 , 今天聊聊图的常见算法 . 图里的算法是很多的&#xff0c;这里我们介绍一些常见的图算法。这些算法一般都比较复杂&#xff0c;我们这里介绍这些算法的基本含义&#xff0c;适合面试的时候装*&#xff0c;如果手写&#xff0c;那就不用啦。 图分析算法&#xf…

【软件体系结构】软件体系结构风格

5.1 软件体系结构风格概述 多年来&#xff0c;人们在开发某些类型软件过程中积累起来的组织规则和结构&#xff0c;形成了软件体系结构风格。 软件体系结构风格&#xff0c;是总结人们设计经验而形成结构较为巩固、组织较为统一的形式&#xff0c;是一种适合于多种场合的相似…

uni-app设置地图显示

使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key 登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面&#xff0c;点击“创建新应用”&…