UIAbility组件间的交互

news/2024/11/13 9:21:33/

一、Want

        是UIAbility组件间交互载体。

        

        Want启动UIAbility组件的两种方式:

        1、显示Want启动

        启动某个明确UIAbility组件时使用;需要在Want参数中设置启动的应用包名和UIAbility组件名。

        2、隐式Want启动

        需要使用某个应用的能力,不关心提供能力的具体应用时使用;不在Want参数中设置启动的UIAbility组件名;需要在Want中设置UIAbility组件的匹配条件;系统根据匹配条件提供命中应用供用户选择。

二、显示Want启动UIAbility组件开发

        1、调用方页面

let context = getContext(this) as common.UIAbilityContext;
let wantInfo: Want = {deviceId: '', // deviceId为空表示本设备bundleName: 'com.samples.stagemodelabilitydevelop',moduleName: 'entry', // moduleName非必选abilityName: 'FuncAbilityA',parameters: {// 自定义信息info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'},
};
// context为调用方UIAbility的UIAbilityContext
context.startAbility(wantInfo).then(() => {hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
}).catch((error: BusinessError) => {hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
});

        2、被调用方UIAbility文件

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';export default class FuncAbilityA extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 接收调用方UIAbility传过来的参数let funcAbilityWant = want;let info = funcAbilityWant?.parameters?.info;}//...
}

        注意:

        在被拉起的FuncAbility中,可以通过获取传递过来的want参数的parameters来获取拉起方UIAbility的PID、Bundle Name等信息。 

        被调用UIAbility冷启动时通过onCreate()函数接收Want,热启动时通过onNewWant()函数接收Want。

三、隐式Want启动UIAbility组件开发---启动浏览器

        1、设置被调用方的module.json5配置文件 

{"module":{"abilities":[{"skills":[{// 设置UIAbility支持的能力类型,如浏览器类型"entities":["entity.system.browsable"],// 设置UIAbility支持的操作,如查看数据"actions":["ohos.want.action.viewData"]}]}
}

        2、调用方页面

let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
let wantInfo: Want = {action: 'ohos.want.action.viewData',entities: ['entity.system.browsable'],url:'https://www.huawei.com/cn/, 
};
// context为调用方UIAbility的UIAbilityContext
context.startAbility(wantInfo).then(() => {// 启动成功
}).catch((error: BusinessError) => {// 启动失败
});

四、UIAbility启动

        一个UIAbility可以对应多个页面,在不同的场景下启动该UIAbility时需要展示不同的页面,例如从一个UIAbility的页面中跳转到另外一个UIAbility时,希望启动目标UIAbility的指定页面。

        UIAbility的启动分为两种情况:UIAbility冷启动和UIAbility热启动。

        1、冷启动

        指的是UIAbility实例处于完全关闭状态下被启动,这需要完整地加载和初始化UIAbility实例的代码、资源等。

        目标UIAbility冷启动时,在目标UIAbility的onCreate()生命周期回调中,接收调用方传过来的参数。然后在目标UIAbility的onWindowStageCreate()生命周期回调中,解析EntryAbility传递过来的want参数,获取到需要加载的页面信息url,传入windowStage.loadContent()方法。

import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window, UIContext } from '@kit.ArkUI';const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';export default class EntryAbility extends UIAbility {funcAbilityWant: Want | undefined = undefined;uiContext: UIContext | undefined = undefined;onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 接收调用方UIAbility传过来的参数this.funcAbilityWant = want;}onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilityhilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');// Main window is created, set main page for this abilitylet url = 'pages/Index';if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {url = 'pages/Page_ColdStartUp';}windowStage.loadContent(url, (err, data) => {// ...});}
}

        2、热启动

        指的是UIAbility实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该UIAbility实例,这种情况下可以快速恢复UIAbility实例的状态。

        在应用开发中,会遇到目标UIAbility实例之前已经启动过的场景,这时再次启动目标UIAbility时,不会重新走初始化逻辑,只会直接触发onNewWant()生命周期方法。为了实现跳转到指定页面,需要在onNewWant()中解析参数进行处理。

        热启动举例:

        

import { hilog } from '@kit.PerformanceAnalysisKit';
import { Want, UIAbility } from '@kit.AbilityKit';
import { window, UIContext } from '@kit.ArkUI';const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';export default class EntryAbility extends UIAbility {funcAbilityWant: Want | undefined = undefined;uiContext: UIContext | undefined = undefined;// ...onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilityhilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');let url = 'pages/Index';if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {url = 'pages/Page_ColdStartUp';}windowStage.loadContent(url, (err, data) => {if (err.code) {return;}let windowClass: window.Window;windowStage.getMainWindow((err, data) => {if (err.code) {hilog.error(DOMAIN_NUMBER, TAG, `Failed to obtain the main window. Code is ${err.code}, message is ${err.message}`);return;}windowClass = data;this.uiContext = windowClass.getUIContext();});hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');});}
}
import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import type { Router, UIContext } from '@kit.ArkUI';
import type { BusinessError } from '@kit.BasicServicesKit';const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';export default class EntryAbility extends UIAbility {funcAbilityWant: Want | undefined = undefined;uiContext: UIContext | undefined = undefined;// ...onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {if (want?.parameters?.router && want.parameters.router === 'funcA') {let funcAUrl = 'pages/Page_HotStartUp';if (this.uiContext) {let router: Router = this.uiContext.getRouter();router.pushUrl({url: funcAUrl}).catch((err: BusinessError) => {hilog.error(DOMAIN_NUMBER, TAG, `Failed to push url. Code is ${err.code}, message is ${err.message}`);});}}}
}


http://www.ppmy.cn/news/1512800.html

相关文章

Ubuntu24.04用C++ Connector连接MySQL数据库

首先安装MySQL官方提供的C Connector库。 sudo apt-get install libmysqlcppconn-dev 然后找一个目录&#xff0c;建立一个main.cpp文件。 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statemen…

从零开始学数据结构系列之第四章《什么是关键路径二》

文章目录 活动的最早发生事件活动的最迟发生事件往期回顾 活动的最早发生事件 注意以下名词&#xff1a; &#xff08;1&#xff09;求所有事件的最早发生时间ve()&#xff1b; &#xff08;2&#xff09;求所有事件的最迟发生时间vl()&#xff1b; &#xff08;3&#xff…

数据结构——顺序栈和链式栈

目录 引言 栈的定义 栈的分类 栈的功能 栈的声明 1.顺序栈 2.链式栈 栈的功能实现 1.栈的初始化 (1)顺序栈 (2)链式栈 (3)复杂度分析 2.判断栈是否为空 (1)顺序栈 (2)链式栈 (3)复杂度分析 3.返回栈顶元素 (1)顺序栈 (2)链式栈 (3)复杂度分析 4.返回栈的大…

VIT论文阅读: A Image is Worth 16x16 Words

简介 在2024年&#xff0c;大家都知道了transformer的故事&#xff0c;但是在4年前, CNN和Transformer谁才是CV的未来&#xff0c;还没有那么确定。 在简介部分&#xff0c;作者提到了一个令人失望的事实&#xff0c;在基于imagenet的实验中发现&#xff0c;transformer的表现…

ubuntu系统突然卡死怎么解救

等待一段时间&#xff1a; 有时系统可能会因为某些任务占用过多资源而变得缓慢。等待一段时间&#xff0c;看看系统是否会自行恢复。 尝试使用终端&#xff1a; 如果系统界面不响应&#xff0c;你可以尝试使用Ctrl Alt F1&#xff08;或F2至F6&#xff09;切换到虚拟终端。登…

基于Java爬取微博数据(二) 正文长文本+导出数据Excel

基于Java爬取微博数据二 正文长文本导出数据Excel 长文本补全导出微博数据到Excel注意点 上一篇文章简单讲述了基于Java爬取微博数据(一)&#xff0c;那么这篇将Java爬取的微博数据导出到Excel中。下面开始具体的操作。 长文本补全 在爬取微博数据的时候&#xff0c;大家可能…

Q*算法深度猜猜:从Q-learning优化到智能决策

Q*算法深度猜猜&#xff1a;从Q-learning优化到智能决策 引言 在强化学习&#xff08;Reinforcement Learning&#xff09;中&#xff0c;Q-learning算法作为一种无模型的学习方法&#xff0c;被广泛应用于解决各种决策优化问题。然而&#xff0c;尽管Q-learning在许多场景下…

C语言:递归

递归简单来说就是函数自己调用自己。 特点&#xff1a;一般代码比较简洁&#xff0c;没有出口。 例子1&#xff1a;用一个函数计算阶乘 #include<stdio.h>//不用递归 int fac(int n) {int val 1;for (int i 1; i <n;i){val * i;}return val; }//用递归 int fac1(…