多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问题 ,有谁知道吗
1355浏览 • 1回复 待解决
如何获取windowStage,有人知道吗
364浏览 • 1回复 待解决
如何实现振动,有人知道吗
1101浏览 • 2回复 待解决
clientid相关问题,有人知道吗
1703浏览 • 1回复 待解决
有人知道吗
78浏览 • 1回复 待解决
如何跳出ForEach,有人知道吗
1946浏览 • 1回复 待解决
有人知道吗
509浏览 • 1回复 待解决
如何保存faultLogger ,有人知道吗
546浏览 • 1回复 待解决
taskpool 使用问题,有人知道吗
828浏览 • 1回复 待解决
如何发送短信,有人知道吗?
1841浏览 • 1回复 待解决
webview组件demo ,有人知道吗
747浏览 • 1回复 待解决
有人知道吗
295浏览 • 1回复 待解决
状态管理相关问题,有人知道吗?
596浏览 • 1回复 待解决
如何获取组件高度,有人知道吗
2015浏览 • 1回复 待解决
怎么主动关闭键盘,有人知道吗
331浏览 • 1回复 待解决
如何实现镂空效果,有人知道吗?
298浏览 • 1回复 待解决
如何获取系统电量,有人知道吗
1969浏览 • 1回复 待解决
charles抓包流程,有人知道吗
553浏览 • 1回复 待解决
$r是否支持嵌套,有人知道吗
275浏览 • 1回复 待解决
IP地址如何转化,有人知道吗
572浏览 • 1回复 待解决
ArkTS要如何使用this,有人知道吗
416浏览 • 1回复 待解决
有人知道吗
732浏览 • 1回复 待解决
是否支持HLS加密播放,有人知道吗
457浏览 • 1回复 待解决
如何调整内存大小,有人知道吗
241浏览 • 1回复 待解决
如何压缩字符串,有人知道吗
719浏览 • 1回复 待解决