HarmonyOS鸿蒙Next中应用接续过程中如何异步设置want自定义数据?

HarmonyOS鸿蒙Next中应用接续过程中如何异步设置want自定义数据? 如题,参照文档“https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#uiabilityoncontinue”中提及的“支持应用在迁移时,使用异步接口进行数据保存”,但实际上设置成功后,在对端无法正确获取数据。


更多关于HarmonyOS鸿蒙Next中应用接续过程中如何异步设置want自定义数据?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者您好,应用接续可以参考一下示例

【背景知识】

应用接续指当用户在一个设备上操作某个应用时,可以在另一个设备的同一个应用中快速切换,并无缝衔接上一个设备的应用体验。比如在用户使用过程中,使用情景发生了变化,之前使用的设备不再适合继续当前任务,或者周围有更合适的设备,此时用户可以选择使用新的设备来继续当前的任务。接续完成后,之前设备的应用可退出或保留,用户可以将注意力集中在被拉起的设备上,继续执行任务。

【解决方案】

场景一:指定页面支持应用接续。

实现方案:

  1. 在EntryAbility中先关闭接续能力。
  2. 在支持接续能力的页面onPageShow()生命周期函数中打开接续能力。
  3. 在支持接续能力的页面onPageHide()生命周期函数中关闭接续能力。

代码示例如下:

// EntryAbility
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, '[EntryAbility]', 'Ability onCreate');
  this.restoreDistributedObject(want, launchParam);
  // 关闭接续能力
  this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE, (result) => {
    console.info(`setMissionContinueState: ${JSON.stringify(result)}`);
  });
}

// PageA:
onPageShow(): void {
  // 开启接续能力
  this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
    console.info('setMissionContinueState ACTIVE result: ', JSON.stringify(result));
  });
}

// PageA:
onPageHide(): void {
  // 关闭接续能力
  this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE, (result) => {
    console.info('setMissionContinueState ACTIVE result: ', JSON.stringify(result));
  });
}

场景二:跨Ability应用接续。

  1. 在MainAbility的onCreate()中关闭接续能力。
  2. 在MainAbility的onCreate/onNewWant中,通过接收的launchParam参数判断是否拉起EntryAbility。
  3. 拉起EntryAbility后,在EntryAbility的onCreate中开启接续能力。
// MainAbility
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, '[EntryAbility]', 'Ability onCreate');
  this.restoreDistributedObject(want, launchParam);
  // 关闭接续能力
  this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE, (result) => {
    console.info(`setMissionContinueState: ${JSON.stringify(result)}`);
  });

  let want: Want = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.samples.stagemodelabilitydevelop',
    moduleName: 'entry', // moduleName非必选
    abilityName: 'EntryAbility',
    parameters: {
      // 自定义信息
      info: '来自EntryAbility UIAbilityComponentsInteractive页面'
    }
  };

  context.startAbilityForResult(want).then((data) => {
    if (data?.resultCode === RESULT_CODE) {
      // 解析被调用方UIAbility返回的信息
      let info = data.want?.parameters?.info;
      if (info !== null) {
        promptAction.showToast({
          message: JSON.stringify(info)
        });
      }
    }
  }
}

// EntryAbility
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, '[EntryAbility]', 'Ability onCreate');
  this.restoreDistributedObject(want, launchParam);
  // 开启接续能力
  this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
    console.info(`setMissionContinueState: ${JSON.stringify(result)}`);
  });
}

更多关于HarmonyOS鸿蒙Next中应用接续过程中如何异步设置want自定义数据?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢您的答复,但是我的问题是如何异步设置参数,

在HarmonyOS Next中使用异步方式设置Want自定义数据,可通过wantAgent.getWantAgent()配合wantAgent.triggerWantAgent()实现。首先创建WantAgentInfo对象并设置operationType为WantAgent.OperationType.START_ABILITY,然后通过WantAgent.getWantAgent()异步获取WantAgent实例。在Want中放入自定义键值数据,最后通过WantAgent.triggerWantAgent()触发接续。自定义数据会随Want传递至目标Ability。注意使用异步回调处理操作结果。

在HarmonyOS Next中,应用接续时异步设置want自定义数据需要注意以下几点:

  1. 在onContinue()中使用异步回调正确设置want参数:
onContinue(wantParam: Want) {
    return new Promise((resolve) => {
        setTimeout(() => {
            wantParam.parameters = {
                'customData': 'your_async_data'
            };
            resolve(true);
        }, 1000);
    });
}
  1. 目标设备接收时,在onCreate()中通过want.parameters获取数据:
onCreate(want: Want) {
    let customData = want.parameters?.customData;
}

常见问题排查:

  1. 确保异步操作完成后才调用resolve()
  2. 检查两端设备API版本是否一致
  3. 确认wantParam参数是否被正确传递
  4. 数据大小不要超过限制(通常建议小于100KB)

如果仍存在问题,建议检查日志中want参数的完整传递过程,确认数据是否被正确序列化和反序列化。

回到顶部