startAbilityForResult 启动一个Ability,Ability被启动后,可通过调用terminateSelfWithResult接口使之终止并且返回结果给调用方。
补充:
- startAbilityForResult返回类型是Promise,接受返回值使用async await
- ~~ 向下取整
1.拉起Ability并传参
Button('拉起PayAbility')
.onClick(async ()=>{
//将当前应用的上下文对象声明为 common.UIAbilityContext 类型。
const context = getContext() as common.UIAbilityContext
//拉起一个Ability,并接收返回值。
const result = await context.startAbilityForResult({
abilityName:'PayAbility', //要拉起的Ability名称
bundleName:'com.example.my_test', //包名
parameters:{
"order_id":Date.now(),
"price":~~(Math.random() * 1000) // ~~ 向下取整
}
})
//返回值处理
if (result.want?.parameters && result.want.parameters["paySuccess"]) {
promptAction.showToast({message:result.want.parameters["paySuccess"].toString()})
}
})
2.PayAbility
如果第一次拉起(创建)Ability,会执行onCreate生命周期钩子,否则执行onNewWant
//首次创建
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
const obj = want.parameters
if (obj) {
//注意:如果页面还没创建,不能通过emitter监听,监听不到
AppStorage.setOrCreate("order_id",obj["order_id"])
AppStorage.setOrCreate("price",obj["price"])
}
}
...
//Ability实例切到后台重新进入
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
const obj = want.parameters
if (obj) {
AppStorage.setOrCreate("order_id",obj["order_id"])
AppStorage.setOrCreate("price",obj["price"])
}
}
3.PayPage
@StorageProp('price') price:number = 0
@StorageProp('order_id') order:number = 0
build() {
Row() {
Column() {
Text(this.order.toString())
.fontSize(50)
.fontWeight(FontWeight.Bold)
Text(this.price.toString())
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('拉起EntryAbility')
.onClick(()=>{
const context = getContext() as common.UIAbilityContext
//terminateSelfWithResult终止当前Ability并返回结果给调用方。
context.terminateSelfWithResult({
resultCode:0, //返回的结果代码
want:{ //want是拉起Ability的载体
abilityName:'EntryAbility',
bundleName:'com.example.my_test',
parameters:{
paySuccess:true
}
}
})
})
}
.width('100%')
}
.height('100%')
}