HMRouter使用自由流转-应用接续-只流转页面栈实操,自由流转,HMRouter+断点的适配

HMRouter使用自由流转-应用接续-只流转页面栈实操,自由流转,HMRouter+断点的适配

官方文档

前提条件

同一个华为账号,同一个用户,同一版本app,打开蓝牙和wife,实现在不同端上数据流转

1.在module.json5文件的abilities中,将continuable标签配置为“true”,表示该UIAbility可被迁移。

在这里插入图片描述

{
  "module": {
    ...
    "abilities": [
      {
        ...
        "continuable": true,
      }
    ]
  }
}

2.在应用迁移启动时,无论是冷启动还是热启动,都会在执行完onCreate()/onNewWant()后,触发onWindowStageRestore()生命周期函数,不执行onWindowStageCreate()生命周期函数。

封装onCreate()/onNewWant()的函数 ,提取initContinue接受传过来的数据

在这里插入图片描述

// 接收B
export const initContinue =
  (want: Want, launchParam: AbilityConstant.LaunchParam, storage: LocalStorage, context: common.UIAbilityContext) => {
    if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
      AppStorage.setOrCreate('CONTINUATION', true);
      // 将上述的保存的数据取出恢复
      if (want.parameters != undefined) {
        console.log('JSON.stringify(want.parameters.HMgetAllPathName)',
          JSON.stringify(want.parameters.HMgetAllPathName))
        AppStorage.setOrCreate('HMgetAllPathName', want.parameters.HMgetAllPathName);
        AppStorage.setOrCreate('HMCurrentParameter', want.parameters.HMCurrentParameter);
        AppStorage.setOrCreate('messageAllContinueApp', want.parameters.messageAllContinueApp);
      }
      console.log('initContinue')

      context.restoreWindowStage(storage);
      setTimeout(() => {
        screenManagerByMedia.registerListenerScreen()
      }, 0)
    }
  }

screenManagerByMedia.registerListenerScreen()是封装的断点的函数,需要在此触发,否则手机(sm)迁移到平板(lg)则不更新或不存在

3.onContinue表适A-B正在接续的时候的A传递的参数

传递参数,页面栈信息,页面携带的参数,还有其他都可以写

如果想使用 使用分布式数据对象迁移数据
封装 onContinueMethods函数

  onContinue(wantParam: Record<string, Object>) {
    return onContinueMethods(wantParam)
  }
。。。。

// 跳转传参
export const onContinueMethods = (wantParam: Record<string, Object>): AbilityConstant.OnContinueResult => {
  let versionDst = wantParam.version; // 获取迁移对端应用的版本号
  let versionSrc: number = 1000000; // 获取迁移源端即本端应用的版本号
  // if (versionDst >= versionSrc) { // 兼容性校验
  //   // 兼容性校验不满足
  //   return AbilityConstant.OnContinueResult.MISMATCH;
  // }
  const getPathStack = HMRouterMgr.getPathStack('mainNavigationId')
  wantParam["HMgetAllPathName"] = JSON.stringify(getPathStack?.getAllPathName() || []) //当前路哟
  wantParam["HMCurrentParameter"] = JSON.stringify(HMRouterMgr.getCurrentParam(HMParamType.routeParam) || '') // 当前路由参数
  wantParam["messageAllContinueApp"] = AppStorage.get('messageAllContinueApp') || '' // demo参数
  console.info(`onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice}`);
  // wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false;
  return AbilityConstant.OnContinueResult.AGREE;
}

这个时候接续已经完成
但是我们需要恢复页面栈和触发断点

4.在入口文件@Entry恢复页面
  onPageShow(): void {
    initPageShowContinueApp()//应用接续的
  }
...


// 恢复页面
export const initPageShowContinueApp = () => {
  console.log('onPageShowonPageShowonPageShowonPageShow', HMRouterMgr.getCurrentParam())
  setTimeout(() => {
    // 接续页面跳转
    if (AppStorage.get('CONTINUATION') as boolean) {
      AppStorage.setOrCreate('CONTINUATION', false);
      const getAllPathName = JSON.parse(AppStorage.get('HMgetAllPathName') as string) as string[]
      if (getAllPathName.length) {
        HMRouterMgr.push({
          pageUrl: getAllPathName[getAllPathName.length-1],
          param: JSON.parse(AppStorage.get('HMCurrentParameter')) || undefined
        });
        // while (getAllPathName.length){
        //   HMRouterMgr.push({ pageUrl: getAllPathName[0],param: HMRouterMgr.getCurrentParam() });
        //   getAllPathName.shift()
        // }
      }
    }
  })
}

总结

1.打开配置"continuable": true,
2.在onContinue传输数据
3.在onCreate()/onNewWant()恢复数据
4.在页面彻底恢复后实现自身业务逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值