多hap调用及数据传递,有人知道吗?

在一个EntryAbility启动另外一个FeatureAbility时,希望在被启动的FeatureAbility完成相关业务后,能将结果返回给调用方。

例如在应用中将入口功能和帐号登录功能分别设计为两个独立的UIAbility,在帐号登录UIAbility中完成登录操作后,需要将登录的结果返回给入口UIAbility。

HarmonyOS
2024-05-26 17:26:17
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
计算机编程小强

使用的核心API

  • 在EntryAbility中,调用startAbilityForResult()接口启动FeatureAbility,    异步回调中的data用于接收FeatureAbility停止自身后返回给EntryAbility的信息。
  • 在FeatureAbility停止自身时,需要调用terminateSelfWithResult()方法, 入参abilityResult为FuncAbility需要返回给EntryAbility的信息。
  • FeatureAbility停止自身后,EntryAbility通过startAbilityForResult()方法回调接收被FeatureAbility返回的信息,RESULT_CODE需要与前面的数值保持一致。

文档链接:启动应用内的UIAbility

核心代码解释

在如下的代码中使用了startAbilityForResult()来启动登录页面,可以通过在参数Want中使用parameters来自定义传递信息。在data中接收信息。

//let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext 
const RESULT_CODE: number = 1001; 
 
let want: Want = { 
  deviceId: '', // deviceId为空表示本设备 
  bundleName: 'com.example.featureabilitydemo', 
  moduleName: 'Login', // moduleName非必选 
  abilityName: 'LoginAbility', 
  parameters: { 
    // 自定义信息 
    info: '来自EntryAbility UIAbilityComponentsInteractive页面' 
  } 
}; 
this.context.startAbilityForResult(want).then((data) => { 
  if (data?.resultCode === RESULT_CODE) { 
    // 解析被调用方UIAbility返回的信息 
    let info = data.want?.parameters?.info; 
    hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(info) ?? ''); 
    console.log(JSON.stringify(info) ?? '') 
    if (info !== null) { 
      promptAction.showToast({ 
        message: JSON.stringify(info) 
      }); 
      this.message = info as string; 
    } 
  } 
  hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(data.resultCode) ?? ''); 
  console.log(JSON.stringify(data.resultCode) ?? '') 
}).catch((err: BusinessError) => { 
  hilog.error(DOMAIN_NUMBER, TAG, `Failed to start ability for result. Code is ${err.code}, message is ${err.message}`); 
  //console.log(`Failed to start ability for result. Code is ${err.code}, message is ${err.message}`) 
});

如下代码使用terminateSelfWithResult()方法来返回之后后的结果,需要通过RESULT_CODE与前面的数值保持一致。

//let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext 
const RESULT_CODE: number = 1001; 
let abilityResult: common.AbilityResult = { 
  resultCode: RESULT_CODE, 
  want: { 
    bundleName: 'com.example.featureabilitydemo', 
    moduleName: 'entry', // moduleName非必选 
    abilityName: 'EntryAbility', 
    parameters: { 
      info: '登录成功' 
    }, 
  }, 
}; 
context.terminateSelfWithResult(abilityResult, (err) => { 
  if (err.code) { 
    hilog.error(DOMAIN_NUMBER, TAG, `Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`); 
    return; 
  } 
});

实现效果

  • 点击登录跳转到FeatureAbility

  • 输入用户名密钥后单击登录成功,返回EntryAbility模块并返回结果。

  • 展示登录成功的结果

分享
微博
QQ
微信
回复
2024-05-27 22:06:18
相关问题
同进程Hap问题 ,有谁知道吗
1460浏览 • 1回复 待解决
taskpool 使用问题,有人知道吗
899浏览 • 1回复 待解决
webview组件demo ,有人知道吗
806浏览 • 1回复 待解决
如何保存faultLogger ,有人知道吗
636浏览 • 1回复 待解决
如何跳出ForEach,有人知道吗
2078浏览 • 1回复 待解决
如何发送短信,有人知道吗?
1930浏览 • 1回复 待解决
有人知道吗
239浏览 • 1回复 待解决
有人知道吗
670浏览 • 1回复 待解决
clientid相关问题,有人知道吗
1852浏览 • 1回复 待解决
如何实现振动,有人知道吗
1178浏览 • 2回复 待解决
如何获取windowStage,有人知道吗
472浏览 • 1回复 待解决
如何获取wifi列表,有人知道吗
564浏览 • 1回复 待解决
导航栏如何适配,有人知道吗?
1828浏览 • 0回复 待解决
有人知道吗
344浏览 • 0回复 待解决
如何实现翻页功能,有人知道吗
1953浏览 • 1回复 待解决
IDE如何开启ASAN,有人知道吗
343浏览 • 1回复 待解决
如何使用快速修复,有人知道吗
690浏览 • 1回复 待解决
如何定义dialog动画,有人知道吗?
1956浏览 • 1回复 待解决
如何引用HSP库,有人知道吗?
1695浏览 • 1回复 待解决
List组件性能问题,有人知道吗
2075浏览 • 1回复 待解决
如何实现图片预览,有人知道吗
645浏览 • 1回复 待解决
$r是否支持嵌套,有人知道吗
369浏览 • 1回复 待解决
如何实现镂空效果,有人知道吗?
386浏览 • 1回复 待解决
有人知道吗
406浏览 • 1回复 待解决
如何获取系统电量,有人知道吗
2045浏览 • 1回复 待解决