HarmonyOS next Ability跳转以及want传参

238 阅读1分钟

startAbilityForResult 启动一个Ability,Ability被启动后,可通过调用terminateSelfWithResult接口使之终止并且返回结果给调用方。

补充:

  1. startAbilityForResult返回类型是Promise,接受返回值使用async await
  2. ~~ 向下取整

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%')
  }