鸿蒙开发学习笔记 #3

Peter 的鸿蒙开发学习笔记

鸿蒙开发学习笔记 #3

学习时间: 2026-03-14 01:15

主题: Ability 生命周期与页面路由

---

1. Ability 概述

1.1 什么是 Ability?

Ability (能力) 是鸿蒙应用的基本组成单元,相当于 Android 的 Activity 或 iOS 的 ViewController。

1.2 Ability 类型

类型说明使用场景

|------|------|----------|

**PageAbility**UI 页面应用主界面 **ServiceAbility**后台服务音乐播放、下载 **DataAbility**数据共享跨应用数据访问 **FormAbility**卡片服务桌面小卡片

---

2. PageAbility 生命周期

2.1 生命周期状态


┌─────────────────────────────────────────┐
│              应用启动                    │
└─────────────────┬───────────────────────┘
                  ▼
┌─────────────────────────────────────────┐
│           onCreate()                    │  ← 创建
│           初始化数据、资源加载          │
└─────────────────┬───────────────────────┘
                  ▼
┌─────────────────────────────────────────┐
│           onForeground()               │  ← 可见
│           页面可见、获取焦点            │
└─────────────────┬───────────────────────┘
                  ▼
┌─────────────────────────────────────────┐
│           onBackground()               │  ← 不可见
│           页面不可见、释放资源          │
└─────────────────┬───────────────────────┘
                  ▼
┌─────────────────────────────────────────┐
│           onDestroy()                   │  ← 销毁
│           释放所有资源                  │
└─────────────────────────────────────────┘

2.2 代码示例


// entry/src/main/ets/entryability/EntryAbility.ets
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  // 创建时调用
  onCreate(want, launchParam) {
    console.log('EntryAbility onCreate');
    // 初始化应用数据
  }

  // 销毁时调用
  onDestroy() {
    console.log('EntryAbility onDestroy');
    // 释放资源
  }

  // 切换到前台
  onForeground() {
    console.log('EntryAbility onForeground');
    // 恢复动画、刷新数据
  }

  // 切换到后台
  onBackground() {
    console.log('EntryAbility onBackground');
    // 暂停动画、保存状态
  }

  // 窗口创建完成
  onWindowStageCreate(windowStage: window.WindowStage) {
    console.log('EntryAbility onWindowStageCreate');

    // 加载首页
    windowStage.loadContent('pages/Index');
  }

  // 窗口销毁
  onWindowStageDestroy() {
    console.log('EntryAbility onWindowStageDestroy');
  }
}

---

3. 页面路由

3.1 基础路由 (router)


import router from '@ohos.router';

// 跳转到下一页
router.pushUrl({
  url: 'pages/SecondPage',
  params: {
    data: '传递的数据'
  }
})

// 替换当前页 (不留返回)
router.replaceUrl({
  url: 'pages/SecondPage'
})

// 返回上一页
router.back()

// 带参数返回
router.back({
  url: 'pages/Index',
  params: {
    result: '返回结果'
  }
})

3.2 接收路由参数


// pages/SecondPage.ets
import router from '@ohos.router';

@Entry
@Component
struct SecondPage {
  // 接收参数
  onPageShow() {
    const params = router.getParams() as Record
    console.log('接收到的数据:', params['data'])
  }

  build() {
    Column() {
      Text('第二页')
        .fontSize(30)
      
      Button('返回')
        .onClick(() => {
          router.back()
        })
    }
  }
}

3.3 命名路由


// 在 module.json5 中配置
{
  "module": {
    "router": [
      {
        "name": "HomePage",
        "pageSourceFile": "pages/HomePage",
        "components": {
          "HomePage": "pages/HomePage"
        }
      }
    ]
  }
}

// 使用命名路由
router.pushNamedRoute({
  name: 'HomePage'
})

---

4. 路由拦截与权限

4.1 路由拦截示例


// 在 EntryAbility 中设置拦截
import router from '@ohos.router';

onWindowStageCreate(windowStage: window.WindowStage) {
  // 设置路由拦截
  router.setInterceptor((toRouterInfo) => {
    const targetUrl = toRouterInfo.url
    
    // 检查登录状态
    if (targetUrl.includes('profile') && !isLoggedIn()) {
      // 重定向到登录页
      return {
        url: 'pages/Login',
        params: { redirect: targetUrl }
      }
    }
    
    return toRouterInfo  // 放行
  })
  
  windowStage.loadContent('pages/Index');
}

---

📝 今日学习总结

  • Ability 类型与作用
  • PageAbility 生命周期
  • 页面路由: push, replace, back
  • 路由参数传递与接收
  • 🔜 下节预告

    数据存储与网络通信

    ---

    笔记持续更新中...