AbilityKit 项目落地清单:从单页 Demo 到可维护应用架构

AbilityKit 项目落地清单:从单页 Demo 到可维护应用架构

主题关键词:分层架构、路由协议、状态管理、测试清单、可维护应用。

文章导读

  • 适合读者:已经会创建 HarmonyOS 工程,但对 AbilityKit 工程边界、生命周期和系统能力衔接不够清晰的开发者。
  • 本篇场景:把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代。
  • 本篇结论:AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。
  • 阅读方式:先看每节配图,再复制关键代码,最后用验收清单检查自己的项目。

目录

  1. 明确本节目标
  2. 理解官方概念
  3. 建立最小工程结构
  4. 声明 Ability 配置
  5. 实现生命周期入口
  6. 加载 ArkUI 页面
  7. 传递业务参数
  8. 读取 Context 能力
  9. 处理前后台切换
  10. 处理重复启动
  11. 处理异常兜底
  12. 释放页面资源
  13. 补充工程封装
  14. 设计验证清单
  15. 本节小结与练习

1. 明确本节目标

场景定位

本节把 明确本节目标 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 分层架构,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 分层架构 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

2. 理解官方概念

场景定位

本节把 理解官方概念 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 路由协议,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 路由协议 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

3. 建立最小工程结构

场景定位

本节把 建立最小工程结构 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 状态管理,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 状态管理 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

4. 声明 Ability 配置

场景定位

本节把 声明 Ability 配置 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 测试清单,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 测试清单 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

5. 实现生命周期入口

场景定位

本节把 实现生命周期入口 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

6. 加载 ArkUI 页面

场景定位

本节把 加载 ArkUI 页面 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

7. 传递业务参数

场景定位

本节把 传递业务参数 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

8. 读取 Context 能力

场景定位

本节把 读取 Context 能力 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

9. 处理前后台切换

场景定位

本节把 处理前后台切换 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

10. 处理重复启动

场景定位

本节把 处理重复启动 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

11. 处理异常兜底

场景定位

本节把 处理异常兜底 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

12. 释放页面资源

场景定位

本节把 释放页面资源 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

13. 补充工程封装

场景定位

本节把 补充工程封装 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

14. 设计验证清单

场景定位

本节把 设计验证清单 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

15. 本节小结与练习

场景定位

本节把 本节小结与练习 放到「把一个单页 Demo 拆成入口层、页面层、服务层、数据层和测试清单,方便后续迭代」这个真实开发场景里理解。它不是孤立 API,而是围绕 AbilityKit 落地不是把 API 跑通,而是把入口、路由、状态、资源和测试边界组织成可维护结构。 展开的一个工程动作。当前关注点是 可维护应用,读者可以把它当成排查 AbilityKit 项目问题时的一条检查线。

实战代码

ts 复制代码
export interface RouteCommand {
  target: 'home' | 'detail' | 'settings';
  params?: Record<string, string | number | boolean>;
}

export class AppNavigator {
  static toWant(command: RouteCommand) {
    return {
      bundleName: 'com.example.abilitykit',
      abilityName: command.target === 'detail' ? 'DetailAbility' : 'EntryAbility',
      parameters: {
        target: command.target,
        ...(command.params ?? {})
      }
    };
  }
}

代码解释

  1. 入口层只处理系统回调、上下文获取和启动协议,不把页面 UI 细节塞进 Ability。
  2. 业务参数要先校验再使用,尤其是来自通知、外部链接、卡片或跨 Ability 跳转的参数。
  3. 生命周期回调里必须区分"初始化一次""每次回前台都执行""退出时释放"三类动作。
  4. 日志要带上业务标识,例如 routeId、taskId、target,方便真机调试时定位问题。

常见坑

Demo 阶段所有跳转都写死在页面按钮里,后续加通知、卡片、分享入口时会到处复制参数。

验收标准

  • 能说清 可维护应用 在 项目落地清单 中承担的职责。
  • 代码能放进 DevEco Studio 工程中按小步验证,而不是只停留在伪代码。
  • 异常分支、生命周期切换和资源释放都有明确处理点。

参考资料

  • 华为 HarmonyOS 官方文档:AbilityKit / UIAbility / Stage 模型相关指南。
  • DevEco Studio 真机调试日志和 ArkTS 工程结构。
相关推荐
益莱储中国29 分钟前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
小天源1 小时前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控
数据工匠老o1 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
benchmark_cc1 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu2 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
CoderYanger2 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
破烂三角裤2 小时前
AI 应用上线后如何判断质量:Prompt 版本、评测集与可观测性
架构
第404号工位2 小时前
手机到底有没有偷听我们?我抓包了 72 小时,抓到了真凶
linux·人工智能·架构
这个DBA有点耶2 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构