# 跨HAP包页面跳转方案

#### 问题现象

在多HAP场景中，开发者需要实现跨HAP模块的页面跳转。Navigation路由操作不支持从一个HAP跳转到另一个HAP的页面，会抛出跳转失败的错误。

#### 背景知识

多HAP场景是指在HarmonyOS中使用多个应用包（一个entry包和多个feature包）来实现复杂应用的开发方式。这种开发模式允许将复杂应用拆分成多个模块，每个模块可以独立开发、测试和更新，提高了开发效率和维护性。

区别于HAR和HSP，每个HAP模块具有各自的UIAbility组件。多HAP应用运行时，同一进程中的UIAbility组件被启动时，才加载对应HAP的资源和代码。Router和Navigation可以实现HAP至HAR/HSP页面的跳转，无法跳转其它HAP页面。可以通过UIAbility中的startAbility方法拉起其它HAP包中的页面。

#### 解决方案

1.  在项目中创建targetHap：
    
2.  在entry模块中使用startAbility拉起targetHap模块的实例，需要配置bundleName和Ability名称，并在被拉起的HAP中配置期望打开的页面即可。发起侧示例代码如下：
    
    ```
    import { BusinessError } from '@kit.BasicServicesKit';
    import { common } from '@kit.AbilityKit';
    
    const BUNDLE_NAME: string = 'com.example.jumphap'; // 在应用app.json5文件中"bundleName"节点获得
    const ABILITY_NAME: string = 'TargetHapAbility'; // 在HAP包的对应Ability文件中获得
    
    @Entry
    @Component
    struct Index {
      private context?: common.UIAbilityContext; // 创建context实例
    
      aboutToAppear(): void {
        this.context = this.getUIContext().getHostContext() as common.UIAbilityContext; // 获取当前页面关联的UIAbilityContext
      }
    
      jumpHap() {
        if (this.context) {
          // 启动Ability，拉起HAP模块的UIAbility实例
          this.context.startAbility({
            bundleName: BUNDLE_NAME,
            abilityName: ABILITY_NAME
          }).then(() => {
            console.info('start ability success');
          }).catch((error: BusinessError) => {
            console.error(`start ability failed, error: ${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(); // 点击跳转
            });
        };
      }
    }
    ```
    
3.  进入“Run”>“Edit Configurations”>“Run/Debug Configuration”，勾选主模块的Deploy Multi Hap/Hsp选框下的Deploy Multi Hap/Hsp Packages和All Modules选项，即可运行验证。
    
4.  若是有多模块页面跳转的需求，建议还是使用静态库HAR或动态库HSP，尽量避免涉及多HAP之间的页面跳转。

#### 常见FAQ

Q：feature类型的HAP包支持导出组件或者接口给其他模块使用吗？

A：feature类型的HAP包不支持导出接口或组件给其他模块使用。该类型的HAP包用于实现动态特性扩展的核心模块设计，可参考案例：示例代码。如果需要共享资源，需要使用HSP(动态共享包)或者HAR(静态共享包)。可参考多HAP场景的使用场景。