HarmonyOS 鸿蒙Next中如何在鸿蒙应用中实现路由管理和深层链接?

HarmonyOS 鸿蒙Next中如何在鸿蒙应用中实现路由管理和深层链接? 如何在鸿蒙应用中实现路由管理?如何支持深层链接和URL路由?

3 回复

关键字:路由管理、深层链接、URL路由、路由配置、路由拦截

回答

原理解析

路由管理统一管理页面导航,深层链接支持从外部打开应用特定页面。

核心概念:

  1. 路由管理:统一的路由配置和导航
  2. 深层链接:通过URL打开应用页面
  3. 路由拦截:在导航前执行逻辑
  4. 路由参数:通过URL传递参数

详细解决步骤

参考文档03的导航实现,这里补充路由管理:

  1. 创建路由管理器
class RouterManager {

  private routes: Map<string, string> = new Map()

  register(path: string, page: string) {
    this.routes.set(path, page)
  }

  navigate(path: string, params?: any) {
    const page = this.routes.get(path)
    if (page) {
      router.pushUrl({ url: page, params })
    }
  }
}
  1. 处理深层链接
// 在EntryAbility中处理
onCreate(want: Want) {
  const uri = want.uri
  if (uri) {
    this.handleDeepLink(uri)
  }
}

示例代码

完整示例:路由管理

// 路由管理器
class RouterManager {
  private static instance: RouterManager | null = null
  private routes: Map<string, { page: string, needAuth?: boolean }> = new Map()

  static getInstance(): RouterManager {
    if (!RouterManager.instance) {
      RouterManager.instance = new RouterManager()
    }
    return RouterManager.instance
  }

  register(path: string, config: { page: string, needAuth?: boolean }) {
    this.routes.set(path, config)
  }

  async navigate(path: string, params?: any): Promise<boolean> {
    const route = this.routes.get(path)
    if (!route) {
      console.error('路由不存在:', path)
      return false
    }

    // 检查权限
    if (route.needAuth && !this.isAuthenticated()) {
      // 跳转到登录页
      router.pushUrl({ url: 'pages/LoginPage' })
      return false
    }

    // 导航到目标页面
    router.pushUrl({
      url: route.page,
      params
    })
    return true
  }

  private isAuthenticated(): boolean {
    // 检查登录状态
    return AppStorage.get('isLoggedIn') === true
  }
}

@Entry
@Component
struct RouterDemo {
  private routerManager = RouterManager.getInstance()

  aboutToAppear() {
    // 注册路由
    this.routerManager.register('home', { page: 'pages/Index' })
    this.routerManager.register('detail', { page: 'pages/DetailPage', needAuth: true })
  }

  build() {
    Column({ space: 20 }) {
      Text('路由管理示例')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .padding(20)

      Button('导航到首页')
        .onClick(() => {
          this.routerManager.navigate('home')
        })
      
      Button('导航到详情页')
        .onClick(() => {
          this.routerManager.navigate('detail', { id: '123' })
        })
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .justifyContent(FlexAlign.Center)
  }
}

参考导航示例效果图。

高级用法

  1. URL路由解析
parseUrl(url: string): { path: string, params: any } {
  const [path, query] = url.split('?')
  const params: any = {}
  
  if (query) {
    query.split('&').forEach(pair => {
      const [key, value] = pair.split('=')
      params[key] = decodeURIComponent(value)
    })
  }
  
  return { path, params }
}
  1. 路由守卫
class RouteGuard {
  static async canActivate(route: Route): Promise<boolean> {
    if (route.needAuth && !this.isAuthenticated()) {
      return false
    }
    return true
  }
}

常见问题

Q: 如何实现路由拦截? A: 在路由管理器中检查条件,不满足时阻止导航。

Q: 深层链接如何配置? A: 在module.json5中配置skills,处理外部URL。

Q: 如何实现路由动画? A: 使用页面过渡动画,在路由配置中设置。

总结:路由管理是应用导航的基础,合理实现可以提升开发效率和用户体验。

更多关于HarmonyOS 鸿蒙Next中如何在鸿蒙应用中实现路由管理和深层链接?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,路由管理通过Router模块实现页面导航。使用router.pushUrl()进行页面跳转,并通过router.back()返回。深层链接通过Want对象配置,在module.json5中声明skillsentitiesactions来定义URI scheme,应用可响应外部链接直接打开特定页面。

在HarmonyOS Next中,路由管理和深层链接主要通过Router模块和Want机制实现。

1. 路由管理 使用@ohos.router模块进行页面路由跳转:

import router from '@ohos.router';

// 普通跳转
router.pushUrl({
  url: 'pages/DetailPage'
});

// 带参数跳转
router.pushUrl({
  url: 'pages/DetailPage',
  params: { id: 123 }
});

2. 深层链接/URL路由 通过配置module.json5支持URL路由:

{
  "module": {
    "abilities": [
      {
        "name": "DetailAbility",
        "srcEntry": "./src/main/ets/DetailPage.ets",
        "skills": [
          {
            "actions": ["action.system.detail"],
            "entities": ["entity.system.browsable"],
            "uris": [
              {
                "scheme": "myapp",
                "host": "detail",
                "path": "/*"
              }
            ]
          }
        ]
      }
    ]
  }
}

3. 参数接收 在目标页面通过router.getParams()获取参数:

import router from '@ohos.router';

@Entry
@Component
struct DetailPage {
  @State id: string = '';

  onPageShow() {
    const params = router.getParams();
    this.id = params?.['id'] || '';
  }
}

4. 外部调用 其他应用可通过Want调用:

let wantInfo = {
  action: 'action.system.detail',
  entities: ['entity.system.browsable'],
  uri: 'myapp://detail/product/123'
};

这种设计保持了鸿蒙的声明式开发范式,通过配置化方式管理路由,同时支持应用内和应用间的统一路由机制。

回到顶部