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.');
});
}