@ohos.app.ability.Want (Want)
Want是对象间信息传递的载体, 可以用于应用组件间的信息传递。 Want的使用场景之一是作为[startAbility]的参数, 其包含了指定的启动目标, 以及启动时需携带的相关数据, 如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当Ability A需要启动Ability B并传入一些数据时, 可使用Want作为载体将这些数据传递给Ability B。
基础用法
let want = {
'deviceId': '', // deviceId为空表示本设备
'bundleName': 'com.extreme.test',
'abilityName': 'MainAbility',
'moduleName': 'entry' // moduleName非必选
};
this.context.startAbility(want, (error) => {
// 显式拉起Ability,通过bundleName、abilityName和moduleName可以唯一确定一个Ability
console.log('error.code = ' + error.code);
})
通过自定字段传递数据,以下为当前支持类型。
- 字符串(String)
let want = {
bundleName: 'com.example.demo',
abilityName: 'com.example.demo.MainAbility',
parameters: {
keyForString: 'str',
},
};
- 数字(Number)
let want = {
bundleName: 'com.example.demo',
abilityName: 'com.example.demo.MainAbility',
parameters: {
keyForInt: 100,
keyForDouble: 99.99,
},
};
- 布尔(Boolean)
let want = {
bundleName: 'com.example.demo',
abilityName: 'com.example.demo.MainAbility',
parameters: {
keyForBool: true,
},
};
- 对象(Object)
let want = {
bundleName: 'com.example.demo',
abilityName: 'com.example.demo.MainAbility',
parameters: {
keyForObject: {
keyForObjectString: 'str',
keyForObjectInt: -200,
keyForObjectDouble: 35.5,
keyForObjectBool: false,
},
},
};
- 数组(Array)
let want = {
bundleName: 'com.example.demo',
abilityName: 'com.example.demo.MainAbility',
parameters: {
keyForArrayString: ['str1', 'str2', 'str3'],
keyForArrayInt: [100, 200, 300, 400],
keyForArrayDouble: [0.1, 0.2],
keyForArrayObject: [{obj1: 'aaa'}, {obj2: 100}],
},
};
- 文件描述符(FD)
import fileio from '@ohos.fileio';
let fd;
try {
fd = fileio.openSync('/data/storage/el2/base/haps/pic.png');
} catch(e) {
console.log('openSync fail:' + JSON.stringify(e));
}
let want = {
'deviceId': '', // deviceId为空表示本设备
'bundleName': 'com.extreme.test',
'abilityName': 'MainAbility',
'moduleName': 'entry', // moduleName非必选
'parameters': {
'keyFd':{'type':'FD', 'value':fd} // {'type':'FD', 'value':fd}是固定用法,用于表示该数据是FD
}
};
this.context.startAbility(want, (error) => {
// 显式拉起Ability,通过bundleName、abilityName和moduleName可以唯一确定一个Ability
console.log('error.code = ' + error.code);
});
- parameter参数用法:以ability.params.backToOtherMissionStack为例,ServiceExtension在拉起UIAbility的时候,可以支持跨任务链返回。
// (1) UIAbility1启动一个ServiceExtension
let context = getContext(this) as common.UIAbilityContext; // UIAbilityContext
let want = {
bundleName: 'com.example.myapplication1',
abilityName: 'ServiceExtensionAbility',
};
context.startAbility(want, (err) => {
console.error(`Failed to startAbility. Code: ${err.code}, message: ${err.message}`);
});
// (2) 该ServiceExtension去启动另一个UIAbility2,并在启动的时候携带参数ability.params.backToOtherMissionStack为true
let context = ...; // ServiceExtensionContext
let want = {
bundleName: 'com.example.myapplication2',
abilityName: 'MainAbility',
parameters: {
"ability.params.backToOtherMissionStack": true,
},
};
context.startAbility(want, (err) => {
console.error(`Failed to startAbility. Code: ${err.code}, message: ${err.message}`);
});
在上述例子中:
- 如果ServiceExtension启动UIAbility2时,不携带ability.params.backToOtherMissionStack参数,或者携带的ability.params.backToOtherMissionStack参数为false,则UIAbility1和UIAbility2不在同一个任务栈里面,在UIAbility2的界面点back键,不会回到UIAbility1的界面。
- 如果携带的ability.params.backToOtherMissionStack参数为true,则表示支持跨任务链返回,此时在UIAbility2的界面点back键,会回到UIAbility1的界面。