JienDa初中lv2

概览

发布的

订单

邀请码

关注

粉丝

收藏

设置

  • 在HarmonyOS中,启动一个UIAbility并获取其返回结果,主要通过 startAbilityForResult 和 terminateSelfWithResult 这两个方法配合实现。下面我将为你详细说明具体的实现步骤和关键代码。

    🧩 核心概念与流程

    实现这一功能的核心流程可以概括为三个步骤:

    1. 调用方启动目标UIAbility:使用 startAbilityForResult 方法,并准备接收返回结果的回调。
    2. 目标UIAbility处理并返回结果:在完成操作后,使用 terminateSelfWithResult 方法结束自身并将数据返回。
    3. 调用方接收并处理结果:在 startAbilityForResult 的成功回调中,解析目标UIAbility返回的数据。

    整个交互过程如下图所示,它清晰地展示了调用方与被调用方之间的协作关系:
    flowchart TD
    A[调用方UIAbility] --> B["启动: startAbilityForResult()"]
    B --> C["执行: 目标UIAbility"]
    C --> D["返回结果: terminateSelfWithResult()"]
    D --> E["接收: 在then回调中处理结果"]
    E --> F["结束: 流程完成"]

    💻 代码实现详解

    1. 调用方启动UIAbility并等待结果

    在调用方(例如 EntryAbility 的页面中),构造一个 Want 对象来指定要启动的目标UIAbility,然后调用 startAbilityForResult 方法。
    import { common, Want } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';

    // 定义一个结果码,用于标识返回来源,需与目标方约定一致
    const RESULT_CODE: number = 1001;

    @Entry
    @Component
    struct Page_UIAbilityComponentsInteractive {
    // 获取UIAbility的上下文
    private context = this.getUIContext().getHostContext() as common.UIAbilityContext;

    build() {
    Column() {
    Button('启动登录界面')
    .onClick(() => {
    let want: Want = {
    deviceId: '', // 空字符串表示本设备
    bundleName: 'com.example.myapplication', // 目标应用包名
    abilityName: 'FuncAbility', // 目标UIAbility名称
    parameters: { // 可传递初始参数
    info: '需要登录'
    }
    };

    // 启动目标UIAbility并等待结果
    this.context.startAbilityForResult(want).then((data) => {
    // 当目标UIAbility调用terminateSelfWithResult后,会进入此回调
    if (data?.resultCode === RESULT_CODE) {
    // 从data.want.parameters中解析返回的数据
    let userInfo = data.want?.parameters?.userInfo;
    let success = data.want?.parameters?.success;
    console.info(`登录结果: ${success}, 用户信息: ${JSON.stringify(userInfo)}`);
    }
    }).catch((err: BusinessError) => {
    console.error(`启动失败, 错误码: ${err.code}, 错误信息: ${err.message}`);
    });
    })
    }
    }
    }

    关键点说明:
    • resultCode 是一个由开发者定义的整数,用于在回调中区分不同目标UIAbility或不同操作的结果。调用方和目标方必须使用相同的值。

    • 返回的数据存放在 data.want.parameters 对象中,可以传递字符串、数字、对象等可序列化的数据 。

    2. 目标UIAbility返回结果

    在被启动的目标UIAbility(例如 FuncAbility)中,当需要结束自身并返回数据时(如用户点击“登录成功”按钮),调用 terminateSelfWithResult 方法。
    import { common } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';

    const RESULT_CODE: number = 1001; // 必须与调用方约定的结果码一致

    @Entry
    @Component
    struct Page_FuncAbility {
    private context = this.getUIContext().getHostContext() as common.UIAbilityContext;

    build() {
    Column() {
    Button('登录成功,返回结果')
    .onClick(() => {
    let abilityResult: common.AbilityResult = {
    resultCode: RESULT_CODE, // 返回结果码
    want: {
    // 可以指定返回给哪个Ability,但通常更关注parameters里的数据
    parameters: {
    success: true,
    userInfo: {
    userId: '123456',
    userName: '张三'
    }
    }
    }
    };

    // 结束自身并将结果返回给调用方
    this.context.terminateSelfWithResult(abilityResult, (err: BusinessError) => {
    if (err) {
    console.error(`返回结果失败, 错误码: ${err.code}, 错误信息: ${err.message}`);
    }
    });
    })
    }
    }
    }

    关键点说明:
    • terminateSelfWithResult 调用后,当前UIAbility实例会被销毁 。

    • 通过 abilityResult.want.parameters 设置要返回给调用方的数据 。

    ⚠️ 重要注意事项

    1. 配置UIAbility为可导出:确保目标UIAbility在 module.json5 配置文件中的 exported 字段设置为 true,否则无法被外部(包括应用内其他UIAbility)启动 。
    {
    "module": {
    "abilities": [
    {
    "name": "FuncAbility",
    "exported": true
    }
    ]
    }
    }

    2. 结果码一致性:调用方和目标方定义的 RESULT_CODE 必须保持一致,否则调用方无法正确接收到结果 。

    3. 异步操作:startAbilityForResult 是一个异步方法,返回的是一个 Promise,需要使用 .then() 和 .catch() 处理成功和失败的情况 。

    4. 启动模式的影响:如果目标UIAbility的启动模式 (launchType) 设置为 singleton,多次启动会复用同一个实例。这时,每次启动并返回结果后,该实例不会销毁,需要仔细设计业务逻辑 。

    💎 总结

    总而言之,通过 startAbilityForResult 和 terminateSelfWithResult 的配合使用,可以高效地在UIAbility之间传递数据。你只需要牢记调用方启动、目标方返回、调用方接收这三个核心环节,并注意结果码一致性和配置导出属性,就能实现完整的带结果返回的启动流程。

    希望这些详细的步骤和代码示例能帮助你顺利实现功能。如果你对特定场景(例如启动指定页面)有更深入的需求,我可以提供进一步的说明。

    HarmonyOS中 如何实现启动 UIAbility 并获取其返回结果​?
  • 啦啦啦啦啦

    努力赚钱
  • 涂鸦[458]

    【C语言】循环嵌套江湖:while小弟+for大哥带你开启封神之路
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索