系列文章目录
(零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“
(一)鸿蒙HarmonyOS开发基础
(二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法
(三)鸿蒙HarmonyOS主力开发语言ArkTS-状态管理
(四)鸿蒙HarmonyOS主力开发语言ArkTS-渲染控制
(五)鸿蒙HarmonyOS主力开发语言ArkTS-数据懒加载(LazyForEach)
文章目录
前言
HarmonyOS应用模型的要素包括:
应用组件:基本组成单位,运行入口。通过生命周期回调感知状态变化。编写应用时,先编写应用组件及其生命周期回调函数,并在配置文件中配置信息。操作系统通过配置文件创建实例并调度生命周期回调函数。
应用进程模型:定义进程的创建、销毁及通信方式。
应用线程模型:定义线程创建、销毁、主线程和UI线程创建方式及线程间通信方式。
应用配置文件:包含应用配置、组件信息、权限、开发者自定义等。提供给编译工具、应用市场和操作系统使用。
随着系统的演进发展,HarmonyOS先后提供了两种应用模型:
FA(Feature Ability)模型:HarmonyOS早期版本开始支持的模型,已经不再主推。
Stage模型:HarmonyOS 3.1 Developer Preview版本开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。
Stage模型之所以成为主推模型,源于其设计思想。
提示:以下是本篇文章正文内容
一、Stage模型开发概述
图1: Stage模型概念图
- AbilityStage
每个Entry或Feature HAP在运行期都有一个AbilityStage实例,当HAP代码首次加载时创建。
- UIAbility组件和ExtensionAbility组件
- UIAbility: 包含UI界面的应用组件,用于与用户交互。例如,图库应用展示图片瀑布流。其生命周期包括创建、销毁、前台、后台等状态。
- ExtensionAbility: 面向特定场景的应用组件。开发者使用其派生类,如FormExtensionAbility(卡片场景)和WorkSchedulerExtensionAbility(闲时任务场景)。派生类实例由用户触发创建,系统管理其生命周期。
- WindowStage
每个UIAbility实例绑定一个WindowStage实例,作为应用进程内窗口管理器,包含一个主窗口,为ArkUI提供绘制区域。
- Context
在Stage模型上,Context及其派生类提供运行期可调用的能力。UIAbility和ExtensionAbility派生类都有各自的Context类,继承自基类Context,提供不同能力。
开发流程
表1: Stage模型开发流程
任务 | 简介 | 相关指导 |
---|---|---|
应用组件开发 | 使用Stage模型的UIAbility和ExtensionAbility组件开发应用 | - 应用/组件级配置 - UIAbility组件 - ExtensionAbility组件 - AbilityStage组件容器 - 应用上下文Context |
了解进程模型 | 介绍Stage模型的进程模型及进程间通信方式 | - 公共事件 |
了解线程模型 | 介绍Stage模型的线程模型及线程间通信方式 | - Emitter - Worker |
应用配置文件 | 介绍Stage模型应用配置文件的开发要求 |
二、Stage模型应用组件
应用/组件级配置
开发应用时,需配置应用的包名、图标等标识特征属性。本文概述了关键配置标签。图标和标签分为应用图标/标签和入口图标/标签,分别在app.json5和module.json5文件的icon和label标签中配置。应用图标和标签用于设置应用,如应用列表;入口图标显示于设备桌面,支持多个入口图标和标签,点击后进入相应UIAbility界面。
UIAbility组件
UIAbility组件概述
UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。
UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。
声明配置
为使应用能够正常使用UIAbility,需要在module.json5
配置文件的abilities
标签中声明UIAbility的名称、入口、标签等相关信息。
{
"module": {
// ...
"abilities": [
{
"name": "EntryAbility", // UIAbility组件的名称
"srcEntry": "./ets/entryability/EntryAbility.ts", // UIAbility组件的代码路径
"description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
"icon": "$media:icon", // UIAbility组件的图标
"label": "$string:EntryAbility_label", // UIAbility组件的标签
"startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
"startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
// ...
}
]
}
}
注意:上述代码仅为示例,实际开发过程中需要根据具体情况进行配置。
UIAbility组件生命周期
当用户打开、切换和返回到对应应用时,应用中的UIAbility
实例会在其生命周期的不同状态之间转换。UIAbility
类提供了一系列回调,通过这些回调可以知道当前UIAbility
实例的某个状态发生改变,会经过UIAbility
实例的创建和销毁,或者UIAbility
实例发生了前后台的状态切换。
UIAbility的生命周期
UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。
生命周期状态说明
Create状态
Create状态为在应用加载过程中,UIAbility
实例创建完成时触发,系统会调用onCreate()
回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
// 页面初始化
}
// ...
}
WindowStageCreate和WindowStageDestroy状态
UIAbility
实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage
。WindowStage
创建完成后会进入onWindowStageCreate()
回调,可以在该回调中设置UI界面加载、设置WindowStage
的事件订阅。
在onWindowStageCreate()
回调中通过loadContent()
方法设置应用要加载的页面并根据需要订阅WindowStage
的事件(获焦/失焦、可见/不可见)。
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: Window.WindowStage) {
// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
// 设置UI界面加载
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
}
说明:WindowStage
的相关使用请参见窗口开发指导。
对应于onWindowStageCreate()
回调。在UIAbility
实例销毁之前,则会先进入onWindowStageDestroy()
回调,可以在该回调中释放UI界面资源。例如在onWindowStageDestroy()
中注销获焦/失焦等WindowStage
事件。
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class EntryAbility extends UIAbility {
// ...
onWindowStageDestroy() {
// 释放UI界面资源
}
}
Foreground和Background状态
Foreground和Background状态分别在UIAbility
实例切换至前台和切换至后台时触发,对应于onForeground()
回调和onBackground()
回调。
onForeground()
回调,在UIAbility
的UI界面可见之前,如UIAbility
切换至前台时触发。可以在onForeground()
回调中申请系统需要的资源,或者重新申请在onBackground()
中释放的资源。
onBackground()
回调,在UIAbility
的UI界面完全不可见之后,如UIAbility
切换至后台时候触发。可以在onBackground()
回调中释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI界面显示之前,可以在onForeground()
回调中开启定位功能,从而获取到当前的位置信息。
当应用切换到后台状态,可以在onBackground()
回调中停止定位功能,以节省系统的资源消耗。
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onForeground() {
// 申请系统需要的资源,或者重新申请在onBackground中释放的资源
}
onBackground() {
// 释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作
// 例如状态保存等
}
}
Destroy状态
Destroy状态在UIAbility
实例销毁时触发。可以在onDestroy()
回调中进行系统资源的释放、数据的保存等操作。
例如调用terminateSelf()
方法停止当前UIAbility
实例,从而完成UIAbility
实例的销毁;或者用户使用最近任务列表关闭该UIAbility
实例,完成UIAbility
的销毁
UIAbility组件启动模式
UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式
singleton启动模式
singleton启动模式为单实例模式,也是默认情况下的启动模式。
每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
说明
应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用startAbility()方法启动该UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
如果需要使用singleton启动模式,在module.json5配置文件中的"launchType"字段配置为"singleton"即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}
multiton启动模式
multiton启动模式为多实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。这种情况下可以将UIAbility配置为multiton(多实例模式)。
图2 多实例模式演示效果
multiton启动模式的开发使用,在module.json5配置文件中的"launchType"字段配置为"multiton"即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "multiton",
// ...
}
]
}
}
specified启动模式
specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。
图3 指定实例模式演示效果
说明
应用的UIAbility实例已创建,该UIAbility配置为指定实例模式,再次调用startAbility()方法启动该UIAbility实例,且AbilityStage的onAcceptWant()回调匹配到一个已创建的UIAbility实例。此时,再次启动该UIAbility时,只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
例如有两个UIAbility:EntryAbility和FuncAbility,FuncAbility配置为specified启动模式,需要从EntryAbility的页面中启动FuncAbility。
1.在FuncAbility中,将module.json5配置文件的"launchType"字段配置为"specified"。
{
"module": {
// ...
"abilities": [
{
"launchType": "specified",
// ...
}
]
}
}
2.在EntryAbility中,调用startAbility()方法时,在want参数中,增加一个自定义参数来区别UIAbility实例,例如增加一个"instanceKey"自定义参数。
// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
function getInstance() {
// ...
}
let want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1', // moduleName非必选
parameters: { // 自定义信息
instanceKey: getInstance(),
},
}
// context为调用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
// ...
}).catch((err) => {
// ...
})
3.由于FuncAbility的启动模式配置为了指定实例启动模式,在FuncAbility启动之前,会先进入其对应的AbilityStage的onAcceptWant()生命周期回调中,解析传入的want参数,获取"instanceKey"自定义参数。根据业务需要通过AbilityStage的onAcceptWant()生命周期回调返回一个字符串Key标识。如果返回的Key对应一个已启动的UIAbility,则会将之前的UIAbility拉回前台并获焦,而不创建新的实例,否则创建新的实例并启动。
import AbilityStage from '@ohos.app.ability.AbilityStage';
export default class MyAbilityStage extends AbilityStage {
onAcceptWant(want): string {
// 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
// 当前示例指的是module1 Module的FuncAbility
if (want.abilityName === 'FuncAbility') {
// 返回的字符串Key标识为自定义拼接的字符串内容
return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
}
return '';
}
}
例如在文档应用中,可以对不同的文档实例内容绑定不同的Key值。当每次新建文档的时候,可以传入不同的新Key值(如可以将文件的路径作为一个Key标识),此时AbilityStage中启动UIAbility时都会创建一个新的UIAbility实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage中再次启动该UIAbility时,打开的仍然是之前原来已保存的文档界面。
以如下步骤所示进行举例说明。
打开文件A,对应启动一个新的UIAbility实例,例如启动“UIAbility实例1”。
在最近任务列表中关闭文件A的进程,此时UIAbility实例1被销毁,回到桌面,再次打开文件A,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例2”。
回到桌面,打开文件B,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例3”。
回到桌面,再次打开文件A,此时对应启动的还是之前的“UIAbility实例2”。
UIAbility组件基本用法
指定UIAbility的启动页面
在OHOS应用中,UIAbility启动时需指定加载页面,否则可能出现白屏。可通过WindowStage
对象的loadContent()
方法在onWindowStageCreate()
回调中设置启动页面。
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: Window.WindowStage) {
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
}
在DevEco Studio中,默认加载Index
页面,可按需替换。
获取UIAbility的上下文信息
UIAbility
类拥有UIAbilityContext
实例,包含配置信息和操作方法。通过this.context
可获取上下文。
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
let context = this.context;
// ...
}
}
在页面中获取上下文,需导入context
模块并定义变量。
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index {
private context = getContext(this) as common.UIAbilityContext;
startAbilityTest() {
let want = {};
this.context.startAbility(want);
}
build() {
// ...
}
}
或在具体使用前定义变量。
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index {
startAbilityTest() {
let context = getContext(this) as common.UIAbilityContext;
let want = {};
context.startAbility(want);
}
build() {
// ...
}
}
UIAbility组件与UI的数据同步
基于HarmonyOS的应用模型,可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。
-
使用EventHub进行数据通信:基于发布订阅模式来实现,事件需要先订阅后发布,订阅者收到消息后进行处理。
-
使用globalThis进行数据同步:ArkTS引擎实例内部的一个全局对象,在ArkTS引擎实例内部都能访问。
-
使用AppStorage/LocalStorage进行数据同步:ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。
使用EventHub进行数据通信
EventHub提供了UIAbility组件/ExtensionAbility组件级别的事件机制,以UIAbility组件/ExtensionAbility组件为中心提供了订阅、取消订阅和触发事件的数据通信能力。接口说明请参见EventHub。
在使用EventHub之前,首先需要获取EventHub对象。基类Context提供了EventHub对象,本章节以使用EventHub实现UIAbility与UI之间的数据通信为例进行说明。
-
在UIAbility中调用eventHub.on()方法注册一个自定义事件“event1”,eventHub.on()有如下两种调用方式,使用其中一种即可。
1. import UIAbility from '@ohos.app.ability.UIAbility'; 3. const TAG: string = '[Example].[Entry].[EntryAbility]'; 5. export default class EntryAbility extends UIAbility { 6. func1(...data) { 7. // 触发事件,完成相应的业务操作 8. console.info(TAG, '1. ' + JSON.stringify(data)); 9. } 11. onCreate(want, launch) { 12. // 获取eventHub 13. let eventhub = this.context.eventHub; 14. // 执行订阅操作 15. eventhub.on('event1', this.func1); 16. eventhub.on('event1', (...data) => { 17. // 触发事件,完成相应的业务操作 18. console.info(TAG, '2. ' + JSON.stringify(data)); 19. }); 20. } 21. }
-
在UI界面中通过eventHub.emit()方法触发该事件,在触发事件的同时,根据需要传入参数信息。
1. import common from '@ohos.app.ability.common'; 3. @Entry 4. @Component 5. struct Index { 6. private context = getContext(this) as common.UIAbilityContext; 8. eventHubFunc() { 9. // 不带参数触发自定义“event1”事件 10. this.context.eventHub.emit('event1'); 11. // 带1个参数触发自定义“event1”事件 12. this.context.eventHub.emit('event1', 1); 13. // 带2个参数触发自定义“event1”事件 14. this.context.eventHub.emit('event1', 2, 'test'); 15. // 开发者可以根据实际的业务场景设计事件传递的参数 16. } 18. // 页面展示 19. build() { 20. // ... 21. } 22. }
-
在UIAbility的注册事件回调中可以得到对应的触发事件结果,运行日志结果如下所示。
1. [] 3. [1] 5. [2,'test']
-
在自定义事件“event1”使用完成后,可以根据需要调用eventHub.off()方法取消该事件的订阅。
1. // context为UIAbility实例的AbilityContext 2. this.context.eventHub.off('event1');
使用globalThis进行数据同步
globalThis是ArkTS引擎实例内部的一个全局对象,引擎内部的UIAbility/ExtensionAbility/Page都可以使用,因此可以使用globalThis全局对象进行数据同步。
图1 使用globalThis进行数据同步
UIAbility和Page之间使用globalThis
globalThis为ArkTS引擎实例下的全局对象,可以通过globalThis绑定属性/方法来进行UIAbility组件与UI的数据同步。例如在UIAbility组件中绑定want参数,即可在UIAbility对应的UI界面上使用want参数信息。
-
调用startAbility()方法启动一个UIAbility实例时,被启动的UIAbility创建完成后会进入onCreate()生命周期回调,且在onCreate()生命周期回调中能够接受到传递过来的want参数,可以将want参数绑定到globalThis上。
1. import UIAbility from '@ohos.app.ability.UIAbility' 3. export default class EntryAbility extends UIAbility { 4. onCreate(want, launch) { 5. globalThis.entryAbilityWant = want; 6. // ... 7. } 9. // ... 10. }
-
在UI界面中即可通过globalThis获取到want参数信息。
1. let entryAbilityWant; 3. @Entry 4. @Component 5. struct Index { 6. aboutToAppear() { 7. entryAbilityWant = globalThis.entryAbilityWant; 8. } 10. // 页面展示 11. build() { 12. // ... 13. } 14. }
UIAbility和UIAbility之间使用globalThis
同一个应用中UIAbility和UIAbility之间的数据传递,可以通过将数据绑定到全局变量globalThis上进行同步,如在AbilityA中将数据保存在globalThis,然后跳转到AbilityB中取得该数据:
-
AbilityA中保存数据一个字符串数据并挂载到globalThis上。
1. import UIAbility from '@ohos.app.ability.UIAbility' 3. export default class AbilityA extends UIAbility { 4. onCreate(want, launch) { 5. globalThis.entryAbilityStr = 'AbilityA'; // AbilityA存放字符串“AbilityA”到globalThis 6. // ... 7. } 8. }
-
AbilityB中获取对应的数据。
1. import UIAbility from '@ohos.app.ability.UIAbility' 3. export default class AbilityB extends UIAbility { 4. onCreate(want, launch) { 5. // AbilityB从globalThis读取name并输出 6. console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr); 7. // ... 8. } 9. }
globalThis使用的注意事项
图2 globalThis注意事项
Stage模型上同名对象覆盖导致问题的场景举例说明。
- 在AbilityA文件中使用globalThis存放了UIAbilityContext。
1. import UIAbility from '@ohos.app.ability.UIAbility'
3. export default class AbilityA extends UIAbility {
4. onCreate(want, launch) {
5. globalThis.context = this.context; // AbilityA存放context到globalThis
6. // ...
7. }
8. }
-
在AbilityA的页面中获取该UIAbilityContext并进行使用。使用完成后将AbilityA实例切换至后台。
1. @Entry 2. @Component 3. struct Index { 4. onPageShow() { 5. let ctx = globalThis.context; // 页面中从globalThis中取出context并使用 6. let permissions = ['com.example.permission'] 7. ctx.requestPermissionsFromUser(permissions,(result) => { 8. // ... 9. }); 10. } 11. // 页面展示 12. build() { 13. // ... 14. } 15. }
-
在AbilityB文件中使用globalThis存放了UIAbilityContext,并且命名为相同的名称。
1. import UIAbility from '@ohos.app.ability.UIAbility' 3. export default class AbilityB extends UIAbility { 4. onCreate(want, launch) { 5. // AbilityB覆盖了AbilityA在globalThis中存放的context 6. globalThis.context = this.context; 7. // ... 8. } 9. }
-
在AbilityB的页面中获取该UIAbilityContext并进行使用。此时获取到的globalThis.context已经表示为AbilityB中赋值的UIAbilityContext内容。
1. @Entry 2. @Component 3. struct Index { 4. onPageShow() { 5. let ctx = globalThis.context; // Page中从globalThis中取出context并使用 6. let permissions = ['com.example.permission'] 7. ctx.requestPermissionsFromUser(permissions,(result) => { 8. console.info('requestPermissionsFromUser result:' + JSON.stringify(result)); 9. }); 10. } 11. // 页面展示 12. build() { 13. // ... 14. } 15. }
-
在AbilityB实例切换至后台,将AbilityA实例从后台切换回到前台。此时AbilityA的onCreate生命周期不会再次进入。
1. import UIAbility from '@ohos.app.ability.UIAbility' 3. export default class AbilityA extends UIAbility { 4. onCreate(want, launch) { // AbilityA从后台进入前台,不会再走这个生命周期 5. globalThis.context = this.context; 6. // ... 7. } 8. }
-
在AbilityA的页面再次回到前台时,其获取到的globalThis.context表示的为AbilityB的UIAbilityContext,而不是AbilityA的UIAbilityContext,在AbilityA的页面中使用则会出错。
1. @Entry 2. @Component 3. struct Index { 4. onPageShow() { 5. let ctx = globalThis.context; // 这时候globalThis中的context是AbilityB的context 6. let permissions=['com.example.permission']; 7. ctx.requestPermissionsFromUser(permissions,(result) => { // 使用这个对象就会导致进程崩溃 8. console.info('requestPermissionsFromUser result:' + JSON.stringify(result)); 9. }); 10. } 11. // 页面展示 12. build() { 13. // ... 14. } 15. }
使用AppStorage/LocalStorage进行数据同步
ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。使用这些方案可以方便地管理应用状态,提高应用性能和用户体验。其中,AppStorage是一个全局的状态管理器,适用于多个UIAbility共享同一状态数据的情况;而LocalStorage则是一个局部的状态管理器,适用于单个UIAbility内部使用的状态数据。通过这两种方案,开发者可以更加灵活地控制应用状态,提高应用的可维护性和可扩展性。详细请参见应用级变量的状态管理
UIAbility组件间交互(设备内)
信息传递载体Want
Want的定义与用途
Want是对象间信息传递的载体,特别用于应用组件间的信息传递。例如,当UIAbilityA需要启动UIAbilityB并传递数据时,Want可作为载体。其关键字段包括bundleName和abilityName,分别用于指定目标Ability的应用包名和Ability名称。
Want的类型
- 显式Want:指定abilityName和bundleName的Want。用于启动当前应用中已知的Ability。
let wantInfo = {
deviceId: '',
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
- 隐式Want:未指定abilityName的Want。用于请求其他应用提供的能力,而不关心具体是哪个应用。
let wantInfo = {
// bundleName可选
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.search',
entities: [ 'entity.system.browsable' ],
uri: 'https://www.test.com:8080/query/student',
type: 'text/plain',
};
说明
- 未匹配到满足条件的Ability:启动失败。
- 匹配到一个满足条件的Ability:直接启动。
- 匹配到多个满足条件的Ability:弹出选择框让用户选择。
Want参数说明
名称 | 读写属性 | 类型 | 必填 | 描述 |
---|---|---|---|---|
deviceId | 只读 | string | 否 | 目标Ability所在设备ID。未设置则默认为本设备。 |
bundleName | 只读 | string | 否 | 目标Ability所在应用名称。 |
moduleName | 只读 | string | 否 | 目标Ability所属的模块名称。 |
abilityName | 只读 | string | 否 | 目标Ability名称。未设置则为隐式Want。同时指定bundleName, moduleName和abilityName可直接匹配指定Ability。 |
uri | 只读 | string | 否 | 携带的数据,一般配合type使用,指明数据类型。 |
type | 只读 | string | 否 | 携带数据类型,使用MIME类型规范。 |
action | 只读 | string | 否 | 要执行的通用操作(如查看、分享)。在隐式Want中定义,配合uri或parameters表示对数据要执行的操作。 |
entities | 只读 | Array | 否 | 目标Ability的额外类别信息。在隐式Want中是对action的补充,用于过滤匹配UIAbility类别。 |
Flags | 只读 | number | 否 | 处理Want的方式。例如是否以设备间迁移方式启动Ability。 |
parameters | 只读 | {[key: string]: any} | 否 | 用于传递自定义数据,通过用户自定义的键值对进行数据填充。 |