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.在页面彻底恢复后实现自身业务逻辑