【鸿蒙应用ArkTS开发系列】- Ability页面跳转(拉起系统相册)信息传递载体Want使用

目录

Want 定义与用途

Want 类型

Want 的使用

1、Stage的上下文Context获取

2、使用Want进行页面跳转-拉起系统相册


上一节我们讲到了页面跳转及传参,使用的router路由跳转,但是有的时候,需要在不同Ability之间进行跳转和传参,比如说应用内多个UIAbility之间跳转,或者是跳到系统的相册去,这个时候router就使用不了了,那怎么办呢,这就需要使用Want进行Ability页面间跳转。

这里的Want,如果是做Android开发的同学,可能就会觉得比较熟悉,有点像Intent。

Want 定义与用途

Want是对象间信息传递的载体,可以用于应用组件间的信息传递。

Want的使用场景之一是作为startAbility的参数,其包含了指定的启动目标,以及启动时需携带的相关数据,如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当AbilityA启动AbilityB并需要传入一些数据给AbilityB时,Want可以作为一个数据载体将数据传给AbilityB。

Want用法如下图:

Want 类型

显式Want: 在启动Ability时指定了abilityName和bundleName的Want称为显式Want。

当有明确处理请求的对象时,通过提供目标Ability所在应用的包名信息(bundleName),并在Want内指定abilityName便可启动目标Ability。显式Want通常在启动当前应用开发中某个已知Ability时被用到。

let want = {

    deviceId: '',

    bundleName: 'com.example.myapplication',

    abilityName: 'calleeAbility',

};

隐式Want:在启动Ability时未指定abilityName的Want称为隐式Want。

当请求处理的对象不明确时,如开发者希望在当前应用中使用其他应用提供的某个能力(通过skills定义),而不关心提供该能力的具体应用,可以使用隐式Want。

let want = {

    // bundleName: 'com.example.myapplication',

    entities: [ 'entity.system.browsable' ],

    uri: '',

    type: 'text/plain',

};

调用方传入的want参数中不带有abilityName和bundleName,则不允许通过隐式Want启动所有应用的ServiceExtensionAbility。

调用方传入的want参数中带有bundleName,则允许使用startServiceExtensionAbility()方法隐式Want启动ServiceExtensionAbility。

Want参数属性说明:

名称

读写属性

类型

必填

描述

deviceId

只读

string

表示目标Ability所在设备ID。如果未设置该字段,则表明本设备。

bundleName

只读

string

表示目标Ability所在应用名称。

moduleName

只读

string

表示目标Ability所属的模块名称。

abilityName

只读

string

表示目标Ability名称。如果未设置该字段,则该Want为隐式。如果在Want中同时指定了bundleName,moduleName和abilityName,则Want可以直接匹配到指定的Ability。

uri

只读

string

表示携带的数据,一般配合type使用,指明待处理的数据类型。如果在Want中指定了uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。

type

只读

string

表示携带数据类型,使用MIME类型规范。例如:"text/plain"、"image/*"等。

action

只读

string

表示要执行的通用操作(如:查看、分享、应用详情)。在隐式Want中,您可定义该字段,配合uri或parameters来表示对数据要执行的操作。如打开,查看该uri数据。例如,当uri为一段网址,action为ohos.want.action.viewData则表示匹配可查看该网址的Ability。

entities

只读

Array<string>

表示目标Ability额外的类别信息(如:浏览器,视频播放器),在隐式Want中是对action的补充。在隐式Want中,您可定义该字段,来过滤匹配Ability类别,如必须是浏览器。例如,在action字段的举例中,可存在多个应用声明了支持查看网址的操作,其中有应用为普通社交应用,有的为浏览器应用,您可通过entity.system.browsable过滤掉非浏览器的其他应用。

flags

只读

number

表示处理Want的方式。例如通过wantConstant.Flags.FLAG_ABILITY_CONTINUATION表示是否以设备间迁移方式启动Ability。

parameters

只读

{[key: string]: any}

此参数用于传递自定义数据,通过用户自定义的键值对进行数据填充,具体支持的数据类型如Want API所示。

Want 的使用

那怎么使用Want跳转到其他的Ability呢,这里需要用到上下文环境。

我们这里只讲Stage模式下的使用。

  • 1、Stage的上下文Context获取

 在stage模型中。context提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用开发路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。比较常用的有AbilityContext在eTS页面中访问Context

  • 在Ability页面中访问Context

Stage模型下,每个Ability中都包含了一个Context属性

在继承Ability的类中通过this.context就可以获取AbilityContext,从而操作Ability的方法(如startAbility、connectAbility等)

import Ability from '@ohos.application.Ability'

export default class MainAbility extends Ability {
    onCreate(want, launchParam) {
   let context = this.context;
    }
    onWindowStageCreate(windowStage) {
        let context = this.context;
    }
    ...
};

如果需要在UIAbility获取上下文,也是一样的方法。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 获取UIAbility实例的上下文
        let context = this.context;

        // ...
    }
}
  • 在eTS页面中访问Context

Stage模型支持了通过context获取resourceManager对象的方式,再调用其内部获取资源的接口,无需再导入包,此方式FA模型不适用。

// 获取当前component关联的Context
let context = getContext(this) as any
复制

当在页面中获取UIAbility实例的上下文信息,则包括导入依赖资源context模块和在组件中定义一个context变量两个部分。

import common from '@ohos.app.ability.common';

@Entry
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext;

  startAbilityTest() {
    let want = {
      // Want参数信息
    };
    this.context.startAbility(want);
  }

  // 页面展示
  build() {
    // ...
  }
}

  • 2、使用Want进行页面跳转-拉起系统相册

这里讲一个拉起系统相册选择图片例子

import common from '@ohos.app.ability.common';

@Entry
@Component
struct Index{


    startAbilityTest() {

      let context = getContext(this) as common.UIAbilityContext;

      let want  = {
          "deviceId": "",
          "bundleName": "",
          "abilityName": "",
          "uri": "",
          "type": "image/*",
          "action": "android.intent.action.GET_CONTENT",
          "parameters":{},
          "entities":[]

      };
      context.startAbility(want);
    }

  build() {
    //...
  }
}

运行效果如下图:

这里只提到了拉起相册的功能,如果要选择图片,需要申请文件读写权限,然后拉起需要选择返回结果的方法(startAbilityForResult)。

本文到此结束,有疑问评论区讨论。

猜你喜欢

转载自blog.csdn.net/q919233914/article/details/129952259