HarmonyOS 鸿蒙Next中使用Navigation跨hap包跳转页面,应用闪退

HarmonyOS 鸿蒙Next中使用Navigation跨hap包跳转页面,应用闪退

咨询场景描述:

使用Navigation跨hap包跳转页面,应用闪退,复现步骤:

  1. 参照官方文档配置了系统路由,使用Navigation挎包跳转页面,调试应用正常。
  2. 卸载调试手机上的应用包,再调试,点击跳转页面操作,应用闪退。
4 回复

你好,Navigation路由操作不支持从一个HAP跳转到另一个HAP的页面,会产生跳转失败的错误。

【背景知识】

多HAP开发是指在HarmonyOS中使用多个应用包(一个entry包和多个feature包)来实现复杂应用的开发方式。这种开发模式允许将复杂应用拆分成多个模块,每个模块可以独立开发、测试和更新,提高了开发效率和维护性。页面路由中的命名路由方法和UIAbility中的startAbility方法提供了跨HAP包的路由跳转功能。

【解决方案】

方案一:使用命名路由法

导入router模块:

import { router } from '@kit.ArkUI';

在想要跳转到的HAP模块的页面里,给@Entry修饰的自定义组件EntryOptions命名,代码示例如下:

[@Entry](/user/Entry)({ routeName : 'myPage' })
@Component
export struct MyHapComponent {
  // HAP模块中自定义组件内容
}

配置成功后需要在跳转的页面中引入命名路由的页面,代码示例如下:

import { BusinessError } from '@kit.BasicServicesKit';
import '@ohos/library/src/main/ets/pages/Index'; // 引入共享包中的命名路由页面
 
[@Entry](/user/Entry)
@Component
struct Index {
  build() {
    RelativeContainer() {
      Button('跳转HAP命名路由法')
        .fontSize(25)
        .width(350)
        .height(50)
        .margin({ top: 400 })
        .alignRules({
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => { 
          // 点击跳转到被命名为'myPage'的HAP模块的页面
          try {
            this.getUIContext().getRouter().pushNamedRoute({
              name: 'myPage'
            })
          } catch (err) {
            let message = (err as BusinessError).message
            let code = (err as BusinessError).code
            console.error(`pushNamedRoute failed, code is ${code}, message is ${message}`);
          }
        })
    }
    .height('100%')
    .width('100%')
  }
}

注意:

使用命名路由方式跳转时,需要在当前应用包的oh-package.json5文件中配置依赖。代码示例如下:

"dependencies": {
   "@ohos/library": "file:../library",
   // ...
}

在代码编辑完成后,需要将所有更改过的模块包都重新构建再调试,否则会报错。

方案二:使用startAbility方法

startAbility方法只需配置使用页面路由的页面,示例代码如下:

import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

const BUNDLE_NAME: string = 'com.example.routeDemo' // 在应用app.json5文件中"bundleName"节点获得
const ABILITY_NAME: string = "hapPageAbility" // 在HAP包的对应Ability文件中获得

[@Entry](/user/Entry)
@Component
struct Index {
  @State message: string = 'Hello World';
  private context?: common.UIAbilityContext // 创建context实例

  aboutToAppear(): void {
    this.context = getContext(this) as common.UIAbilityContext // 获取当前页面关联的UIAbilityContext
  }

  jumpHap() {
    if (this.context) {
      // 启动Ability,拉起HAP模块的UIAbility实例
      this.context.startAbility({
        bundleName: BUNDLE_NAME,
        abilityName: ABILITY_NAME
      }).then(() => {
        console.info('start audio ability success')
      }).catch((error: BusinessError) => {
        console.error('start audio ability failed, error: ' + JSON.stringify(error))
      })
    }
  }

  build() {
    RelativeContainer() {
      Button('startAbility跳转HAP')
        .fontSize(25)
        .width(350)
        .height(50)
        .margin({ top: 400 })
        .alignRules({
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.jumpHap() // 点击跳转
        })
    }
  }
}

【常见FAQ】

Q:未来是否有支持使用Navigation操作直接跨HAP模块跳转页面的计划?

A:未来也不会支持使用Navigation操作直接跨HAP模块跳转页面。

更多关于HarmonyOS 鸿蒙Next中使用Navigation跨hap包跳转页面,应用闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


未来也不会支持使用Navigation操作直接跨HAP模块跳转页面。

在HarmonyOS鸿蒙Next中,使用Navigation跨hap包跳转页面时,应用闪退可能是由于以下原因:

  1. 目标页面的Ability或Page未正确配置或注册;

  2. 跨hap包的页面跳转未正确声明依赖关系;

  3. 目标hap包的资源或页面未正确加载;

  4. 权限配置不足,导致跨包访问受限。

检查相关配置和日志,确保跨hap包跳转的路径和依赖关系正确无误。

根据描述,这个问题可能涉及跨hap包跳转时的模块加载机制。建议检查以下几点:

  1. 确保目标hap包已正确安装且未被卸载。跨hap跳转需要目标模块已安装并可用。

  2. 检查navigation路由配置是否正确,特别是targetBundle和targetAbility参数是否准确指向目标hap包。

  3. 查看崩溃日志,确认具体错误类型。常见问题包括:

    • 目标模块未找到(MODULE_NOT_FOUND)
    • 权限问题(PERMISSION_DENIED)
    • 路由解析失败(ROUTE_PARSE_ERROR)
  4. 尝试在跳转前使用AbilityManager的getAbilityInfo()方法验证目标ability是否存在。

  5. 确保开发环境配置正确,包括module.json中的相关声明。

建议提供更详细的错误日志以便进一步分析问题原因。

回到顶部