HarmonyOS 鸿蒙Next中如何使用App Linking实现应用跳转
HarmonyOS 鸿蒙Next中如何使用App Linking实现应用跳转
【问题现象】
在配置App Linking时,应用作为被拉起应用,冷启动情况下应用闪退,报错显示UIAbility未正常启动,涉及在EntryAbility的onCreate方法中有处理App Linking参数和跳转相关页面的操作。
问题demo的EntryAbility中参数配置如下:
// 冷启动
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.getRouterUri(want);
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
}
private getRouterUri(want: Want) {
let uri: string | undefined = want?.uri;
if (uri) {
// 开发者根据解析的uri跳转至响应页面,例如需要跳转页面为"pages/Access"
let status: router.RouterState = router.getState();
if (status && status.name !== 'Access' && uri) {
// 根据uri参数做业务处理
router.replaceUrl({
url: 'pages/Page1',
params: {
uri: uri
}
})
}
}
}
【背景知识】
1. App Linking与冷启动概念:App Linking用于实现应用间的深度链接,冷启动是指应用从完全未运行状态启动。在此场景下,涉及到应用接收参数并正确跳转页面的处理机制。
2. HarmonyOS 相关代码环境:代码基于HarmonyOS,在EntryAbility中有对Want对象的处理,包括获取uri等参数,并尝试根据参数进行页面跳转。涉及到的相关API包括router相关操作、Ability的生命周期方法(如onCreate、onWindowStageCreate)以及相关的日志输出(hilog)功能。
【定位思路】
分析当前问题可能出在冷启动时在onCreate方法中进行页面跳转(router操作)的处理方式上,可能导致UIAbility启动异常。需要重新审视这种在生命周期早期进行页面跳转的合理性,并考虑合适的处理参数和加载页面的时机。
【解决方案】
- 不应该在onCreate()里面写跳转router操作,而是在onCreate里解析参数。在EntryAbility中定义参数(如funcAbilityWant)用于接收调用方UIAbility传过来的参数。
- 在onWindowStageCreate中根据解析后的参数来加载页面。例如,根据funcAbilityWant中的parameters.router值来决定加载的页面(如值为 ‘funcA’ 则加载 ‘pages/Page_ColdStartUp’,否则加载 ‘pages/Index’),通过windowStage.loadContent方法加载页面,并处理可能的错误和数据。
代码示例如下:
import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window, UIContext } from '@kit.ArkUI';
const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';
export default class EntryAbility extends UIAbility {
funcAbilityWant: Want | undefined = undefined;
uiContext: UIContext | undefined = undefined;
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 接收调用方UIAbility传过来的参数
this.funcAbilityWant = want;
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
// Main window is created, set main page for this ability
let url = 'pages/Index';
if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {
url = 'pages/Page_ColdStartUp';
}
windowStage.loadContent(url, (err, data) => {
// ...
});
}
}
- 可参考官方文档链接:目标UIAbility冷启动,获取更多关于UIAbility设备内交互相关指导。
【总结】
应用冷启动的流程和几个重要的生命周期。应用冷启动的过程大致可分成以下四个阶段:应用进程创建&初始化、Application&Ability初始化、Ability/AbilityStage生命周期、加载绘制首页,如下图所示:
这个问题是在Ability/AbilityStage生命周期:该阶段主要是AbilityStage/Ability的启动生命周期,执行相应的生命周期回调。
此问题是HarmonyOS应用在处理App Linking冷启动时因在错误的生命周期方法(onCreate)中进行页面跳转操作导致UIAbility启动异常的问题。通过将参数解析和页面加载操作分别放在onCreate和onWindowStageCreate方法中,依据合适的参数判断来加载正确页面的方式解决。
开发者在处理类似的应用启动和页面跳转逻辑时,应注意遵循HarmonyOS应用生命周期的规范,避免在不适当的时机执行可能影响启动流程的操作,并充分利用官方文档作为开发指导。
更多关于HarmonyOS 鸿蒙Next中如何使用App Linking实现应用跳转的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next中如何使用App Linking实现应用跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,App Linking是一种用于实现应用间跳转的机制
通过App Linking,开发者可以生成一个唯一的链接,用户点击该链接时,系统会自动跳转到指定的应用或页面。具体实现步骤如下:
-
创建App Linking:在DevEco Studio中,选择“Tools” -> “App Linking”,然后点击“Create”按钮。填写相关信息,如链接名称、目标应用包名、目标页面路径等,生成App Linking。
-
配置App Linking:在应用的
config.json
文件中,添加App Linking的配置信息。确保目标页面路径与App Linking中设置的一致。 -
处理App Linking:在目标页面的
onInit
方法中,通过router.getParams()
获取App Linking传递的参数,并根据参数执行相应的逻辑。 -
分享App Linking:将生成的App Linking通过短信、邮件或其他方式分享给用户。用户点击链接后,系统会自动跳转到目标应用或页面。
-
测试App Linking:在DevEco Studio中,使用“Previewer”或“Remote Device”测试App Linking的功能,确保跳转和参数传递正常。
通过以上步骤,可以在HarmonyOS鸿蒙Next中使用App Linking实现应用跳转。