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启动异常。需要重新审视这种在生命周期早期进行页面跳转的合理性,并考虑合适的处理参数和加载页面的时机。

【解决方案】

  1. 不应该在onCreate()里面写跳转router操作,而是在onCreate里解析参数。在EntryAbility中定义参数(如funcAbilityWant)用于接收调用方UIAbility传过来的参数。
  2. 在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) => {
      // ...
    });
  }
}
  1. 可参考官方文档链接:目标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

1 回复

更多关于HarmonyOS 鸿蒙Next中如何使用App Linking实现应用跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,App Linking是一种用于实现应用间跳转的机制

通过App Linking,开发者可以生成一个唯一的链接,用户点击该链接时,系统会自动跳转到指定的应用或页面。具体实现步骤如下:

  1. 创建App Linking:在DevEco Studio中,选择“Tools” -> “App Linking”,然后点击“Create”按钮。填写相关信息,如链接名称、目标应用包名、目标页面路径等,生成App Linking。

  2. 配置App Linking:在应用的config.json文件中,添加App Linking的配置信息。确保目标页面路径与App Linking中设置的一致。

  3. 处理App Linking:在目标页面的onInit方法中,通过router.getParams()获取App Linking传递的参数,并根据参数执行相应的逻辑。

  4. 分享App Linking:将生成的App Linking通过短信、邮件或其他方式分享给用户。用户点击链接后,系统会自动跳转到目标应用或页面。

  5. 测试App Linking:在DevEco Studio中,使用“Previewer”或“Remote Device”测试App Linking的功能,确保跳转和参数传递正常。

通过以上步骤,可以在HarmonyOS鸿蒙Next中使用App Linking实现应用跳转。

回到顶部