Skip to content

UIAbility 案例

概述

在开发中需要一个应用不可能只有一个 UIAbility 窗口

比如,当我们去购买东西去支付,我们吊起了微信的支付页面,新开一个任务去专门处理这件事,就可以采用拉起一个新的 Ability 来实现

示例代码:

第一步(创建项目)

先创建一个项目

图片

第二步(创建两个 Ability)

创建另外的 Ability

名字必须是纯英文

图片

图片

现在就是两个 Ability 了

图片

第三步(处理下新建的 Ability)

在新建的 Ability 中先处理下文本

图片

第四步

尝试在之前的 entry 模块中去拉起新建模块的 ability

  • 在 entry 中 pages/index 页面编写
js
import { common,Want } from '@kit.AbilityKit';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  setAbility(){
    const context = getContext(this) as common.UIAbilityContext
    // want 参数
    let want:Want = {
      // 包名(可在最外层的AppScope文件下的app.json5文中bundleName属性)
      bundleName:"com.example.uiabilitybasic1",
      // Ability名称 (要拉起的Ability名称)(可以在application>main>module.json5中module下abilities中name属性)
      abilityName:"ApplicationAbility",
      // 模块名称 因为是两个模块需要使用模块名称(可以在application>main>module.json5中module下name属性)
      moduleName:"application"
    }
    // 吊起want 参数指定的ability
    context.startAbility(want)
  }
  build() {
    Column() {
      Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)
      Button("尝试拉起application能力").type(ButtonType.Capsule).onClick(()=>{
          this.setAbility()
      })
    }.width('100%').height('100%').backgroundColor(Color.Red)
  }
}

测试

  • 测试必须使用模拟器

  • 一定要多模块同时启动,否则拉不起来

图片

图片

图片

  • 测试结果

图片

备注

多开 Ability

  • 要是想每次拉起的 Ability 都重新创建一个,这样在任务列表里面就会有很多个。

  • 可以在新开的 Ability 中设置 launchType:"multiton" 这样每次拉起都会复用已经存在的 Ability

具体位置

在新开的 Ability 中 src > main > module.json5>module>abilities

新增 launchType:"multiton"

json
{
  "module": {
    "name": "application",
    "type": "feature",
    "description": "$string:module_desc",
    "mainElement": "ApplicationAbility",
    "deviceTypes": ["phone", "tablet", "2in1"],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "ApplicationAbility",
        "srcEntry": "./ets/applicationability/ApplicationAbility.ets",
        "description": "$string:ApplicationAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:ApplicationAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "launchType": "multiton"
      }
    ]
  }
}

启动不同的页面

  • 仅仅需要在新建的 application>src>main>ets>(你自己新建的 applicationability)>ApplicationAbility.ets 文件中修改

windowStage.loadContent 路径

bash

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Test', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }