ArkTS Api详解(Want)

29 阅读2分钟

@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的界面。