适用版本:Stage 模型,API 11(DevEco Studio 4.x),Ability Kit。低于 API 11 的导入路径略有差异,文中已标注。 场景:首页 EntryAbility 拉起独立 LoginAbility 完成登录,登录成功后把 token 带回首页并关闭登录页。
在 HarmonyOS 应用里,很多业务需要「跳到另一个 Ability 处理完,再把结果带回来」:登录、选地址、选图片、授权确认都是典型场景。如果只用 startAbility 跳转,两个 Ability 之间就没有返回值通道,只能靠全局状态或数据库中转,耦合重、易出错。
startAbilityForResult 正是官方提供的「带返回值的启动」能力:调用方拿到 AbilityResult { resultCode, want },被调方用 terminateSelfWithResult 把结果原路送回。本文以「登录并返回 token」为例,给出可复制的完整代码。
AbilityContext.startAbilityForResult(want) → 返回 Promise<AbilityResult>,结构体为 { resultCode: number, want: Want }。AbilityContext.terminateSelfWithResult(result) → 关闭当前 Ability 并把 result 回传给调用方。两个 API 都在 AbilityContext 上,必须在 UIAbility 生命周期内或页面里通过 getContext(this) 取得,工具类/普通 TS 模块拿不到。
在 EntryAbility 或其页面中:
低于 API 11 时,
Want/AbilityResult来自@ohos.app.ability.Want等旧路径;API 11 起统一收进@kit.AbilityKit,推荐用 kit 写法。
LoginAbility 对应的页面(或 Ability 内)在登录成功后:
关键点:结果只能装在 want.parameters 里回传,不能通过函数 return;调用 terminateSelfWithResult 后当前 Ability 会被销毁。
LoginAbility 必须已在 module.json5 的 abilities 中声明(同应用内用 abilityName 直接拉起即可,无需额外 skills)。若是跨应用用 action 拉起,则需在被调方配置 skills 与 action,并在 want 里填 action 而非 abilityName。
as common.UIAbilityContext,普通 Context 上没有这两个方法。LOGIN_SUCCESS = 1000。parameters,不是 want 顶层,也不是 return。startAbilityForResult 支持 AsyncCallback 和 Promise 两种写法,二选一,别两边都写导致重复执行。terminateSelf() 关闭,调用方会收到默认 resultCode(通常 0),拿不到 token。startAbilityForResult + terminateSelfWithResult 是 HarmonyOS 中实现「Ability 间带结果跳转」的标准做法,比全局变量中转更清晰、可维护性更好。记住两条主线:调用方等 AbilityResult,被调方用 want.parameters 回传。把 resultCode 抽成常量、统一在页面层拿 UIAbilityContext,就能避开绝大部分坑。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。