鸿蒙HarmonyOS实战-Stage模型(开发卡片事件)

news/2024/11/15 9:32:11/文章来源:https://www.cnblogs.com/shudaoshan/p/18203026

🚀一、开发卡片事件

HarmonyOS元服务卡片页面(Metaservice Card Page)是指在HarmonyOS系统中,用于展示元服务的页面界面。元服务是指一组提供特定功能或服务的组件,例如天气服务、音乐播放服务等。元服务卡片页面可以显示元服务的相关信息和操作选项,用户可以通过点击卡片页面上的按钮或交互元素来使用相关的元服务功能。元服务卡片页面提供了一种快速访问和使用元服务的方式,方便用户进行各种操作和任务。

🔎1.卡片事件能力说明

postCardAction()接口是ArkTS卡片中用于实现卡片内部和提供方应用间交互的方法。目前这个接口支持三种类型的事件:router、message和call,并且仅在卡片中可以调用。

  • router类型的事件可以用来执行页面跳转或路由切换的操作。通过指定目标路由和传递参数,可以实现页面之间的跳转或路由切换。

  • message类型的事件用于发送消息或通知给提供方应用。可以通过指定目标应用和消息内容,向提供方应用发送消息或通知。

  • call类型的事件用于调用提供方应用的函数或方法。可以通过指定目标应用、要调用的函数或方法名以及传递的参数,调用提供方应用中的函数或方法。

postCardAction()接口仅在卡片内部可以调用,无法在提供方应用中直接调用。这个接口提供了卡片和提供方应用之间进行交互的方式,可以实现卡片的功能扩展和与提供方应用的数据交互。

image

🔎2.使用router事件跳转到指定UIAbility

1、元服务界面

@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%')}
}

image

2、UIAbility接收参数

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

image

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

1、元服务界面

@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%')}
}

2、UIAbility接收参数

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

不截图同上

🔎4.通过message事件刷新卡片内容

1、卡片页面

let storage = new LocalStorage();@Entry(storage)
@Component
struct WidgetCard {@LocalStorageProp('title') title: string = 'init';@LocalStorageProp('detail') detail: string = 'init';build() {Column() {Button('刷新').onClick(() => {postCardAction(this, {'action': 'message','params': {'msgTest': 'messageEvent'}});})Text(`${this.title}`)Text(`${this.detail}`)}.width('100%').height('100%')}
}

2、卡片FormExtensionAbility

import formBindingData from '@ohos.app.form.formBindingData';
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formProvider from '@ohos.app.form.formProvider';export default class EntryFormAbility extends FormExtensionAbility {onFormEvent(formId, message) {// Called when a specified message event defined by the form provider is triggered.console.info(`FormAbility onEvent, formId = ${formId}, message: ${JSON.stringify(message)}`);let formData = {'title': 'Title Update Success.', // 和卡片布局中对应'detail': 'Detail Update Success.', // 和卡片布局中对应};let formInfo = formBindingData.createFormBindingData(formData)formProvider.updateForm(formId, formInfo).then((data) => {console.info('FormAbility updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('FormAbility updateForm failed: ' + JSON.stringify(error));})}
}

image

🔎5.通过router或call事件刷新卡片内容

🦋5.1 router

1、卡片

let storage = new LocalStorage();@Entry(storage)
@Component
struct WidgetCard {@LocalStorageProp('detail') detail: string = 'init';build() {Column() {Button('跳转').margin('20%').onClick(() => {console.info('postCardAction to EntryAbility');postCardAction(this, {'action': 'router','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'detail': 'RouterFromCard'}});})Text(`${this.detail}`).margin('20%')}.width('100%').height('100%')}
}

2、UIAbility

import UIAbility from '@ohos.app.ability.UIAbility';
import formBindingData from '@ohos.app.form.formBindingData';
import formProvider from '@ohos.app.form.formProvider';
import formInfo from '@ohos.app.form.formInfo';export default class EntryAbility extends UIAbility {// 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调onCreate(want, launchParam) {console.info('Want:' + JSON.stringify(want));if (want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY];let message = JSON.parse(want.parameters.params).detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message + ': onCreate UIAbility.', // 和卡片布局中对应};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}}// 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调onNewWant(want, launchParam) {console.info('onNewWant Want:' + JSON.stringify(want));if (want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY];let message = JSON.parse(want.parameters.params).detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message + ': onNewWant UIAbility.', // 和卡片布局中对应};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}}...
}

🦋5.2 call

1、在使用postCardAction接口的call事件时,需要在FormExtensionAbility中的onAddForm生命周期回调中更新formId。

import formBindingData from '@ohos.app.form.formBindingData'; 
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';export default class EntryFormAbility extends FormExtensionAbility {onAddForm(want) {let formId = want.parameters["ohos.extra.param.key.form_identity"];let dataObj1 = {"formId": formId};let obj1 = formBindingData.createFormBindingData(dataObj1);return obj1;}...
};

2、卡片界面

let storage = new LocalStorage();@Entry(storage)
@Component
struct WidgetCard {@LocalStorageProp('detail') detail: string = 'init';@LocalStorageProp('formId') formId: string = '0';build() {Column() {Button('拉至后台').margin('20%').onClick(() => {console.info('postCardAction to EntryAbility');postCardAction(this, {'action': 'call','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'method': 'funA','formId': this.formId,'detail': 'CallFromCard'}});})Text(`${this.detail}`).margin('20%')}.width('100%').height('100%')}
}
let storage = new LocalStorage();@Entry(storage)
@Component
struct WidgetCard {@LocalStorageProp('detail') detail: string = 'init';@LocalStorageProp('formId') formId: string = '0';build() {Column() {Button('拉至后台').margin('20%').onClick(() => {console.info('postCardAction to EntryAbility');postCardAction(this, {'action': 'call','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'method': 'funA','formId': this.formId,'detail': 'CallFromCard'}});})Text(`${this.detail}`).margin('20%')}.width('100%').height('100%')}
}

3、UIAbility界面

import UIAbility from '@ohos.app.ability.UIAbility';
import formBindingData from '@ohos.app.form.formBindingData';
import formProvider from '@ohos.app.form.formProvider';
import formInfo from '@ohos.app.form.formInfo';
const MSG_SEND_METHOD: string = 'funA'// 在收到call事件后会触发callee监听的方法
function FunACall(data) {// 获取call事件中传递的所有参数let params = JSON.parse(data.readString())if (params.formId !== undefined) {let curFormId = params.formId;let message = params.detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}return null;
}
export default class EntryAbility extends UIAbility {// 如果UIAbility第一次启动,call事件后会触发onCreate生命周期回调onCreate(want, launchParam) {console.info('Want:' + JSON.stringify(want));try {// 监听call事件所需的方法this.callee.on(MSG_SEND_METHOD, FunACall);} catch (error) {console.log(`${MSG_SEND_METHOD} register failed with error ${JSON.stringify(error)}`)}}...
}

🚀写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

image

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

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

相关文章

【论文阅读】FlexGraph: A Flexible and Efficient Distributed Framework for GNN Training

阅读思考问题: Please briefly describe how hierarchical dependency graphs are built in FlexGraph, and point out the specific stage in the NAU abstraction where this process takes place. 请简要描述在FlexGraph中如何构建分层依赖图,并指出在NAU抽象中的具体阶段…

N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍

10 几年前,互联网产业蓬勃发展,相比传统 IT 企业,互联网应用每天会产生海量的数据。 如何存储和分析这些数据成为了当时技术圈的痛点,彼时,分库分表解决方案应运而生。 当时最流行的 Java 技术论坛是 javaeye ,有位淘宝的技术人员分享了一篇分库分表的文章 ,这篇文章,我…

4、Git之分支操作

4.1、分支的概述 在版本控制过程中,当需要同时推进多个任务时,可以为每个任务创建的单独分支。 虽然分支的底层实现是指针的引用,但是初学阶段可以将分支简单理解为副本,一个分支就是一个单独的副本。 使用分支,意味着从原来的主干上分离开,在分支上做的任何改动,在合并…

Spring 对 Junit4,Junit5 的支持上的运用

1. Spring 对 Junit4,Junit5 的支持上的运用 @目录1. Spring 对 Junit4,Junit5 的支持上的运用每博一文案2. Spring对Junit4 的支持3. Spring对Junit5的支持4. 总结:5. 最后:每博一文案 关于理想主义,在知乎上看到一句话:“他们并不是不懂别人口中的现实,他们只是不信,事…

Eclipase的JNnit导包报错

在使用Eclipase 创建项目时系统会自动帮我们生成一个module文件,JNnit单元测试时,记得删除自动生成的 module-info.java文件,不然会一直报错找不到 org

来玩 GitHub 啊,SSH 连接方式

Windows 11 git version 2.32.0.windows.2 GitHub 20240520 --今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的过程。 简述为:创建SSH密钥对 公钥注…

来玩 GitHub 啊,SSH 连接

今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的国产。主要文档 1、Connecting to GitHub with SSH https://docs.github.com/en/authentication/con…

ABC 354 (atcoder beginer 354) D、E、F

D检查: 1. 有可能是推导式有问题,比如-/+写错 2. x,y A、B、C、D 顺序可能搞反了 不要盲目调试,先用人眼看一下代码的情况,找一下错误很简单的找规律的题目。 很不能理解过的人,就这些。 x方向,y方向,都是4行/列,一个规律的循环。求(0,0)到(x,y)中的黑色块: 第0-3…

BUUCTF-WEB(21-25)

[HCTF 2018]admin 这道题目就是admin说明得管理员登录 那我直接创一个admin的账号但是显示已经存在了说明用户名就是admin,然后我们直接爆破,也是爆破出来密码就是123直接登录[MRCTF2020]你传你🐎呢 这个题就是文件上传,我们MIME绕过,后缀名都被ban了,我们上传.htaccess…

5.8-随堂练习1

1992年,姜万勐 看到 MPEG芯片 Epiphany – 用MPEG1 把图像和声音同时存储在一张小光盘上 VCD(Video Compact Disc)。 1993年9月 万燕第一批1000台VCD机下线。 几乎都被国内外家电公司买去解剖做样机 万燕VCD 100% 市场份额 1995年 各路仿制的VCD机大举进军市场,竞争激烈。 …

5.8-随堂练习-小组练习2

结合本小组项目写下能想到的所有 SWOT答案: 【第九组】 在充电桩电控系统项目中,可以想到以下所有的SMOT(Strengths, Weaknesses, Opportunities, Threats): Strengths (强项):功能丰富:系统具有多种功能,包括充电桩管理、用户充电、支付功能等。 易用性:界面设计简洁…

foobar2000 v2.1.5 汉化版

foobar2000 v2.1.5 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…