跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端

鸿蒙原子化服务与元服务卡片开发指南

综述由AI生成鸿蒙原子化服务是一种无需安装、即点即用的应用形态,支持跨设备运行。元服务卡片则提供桌面快捷访问核心功能的能力。原子化服务的架构设计,包括单 Ability 模式及页面展示。通过示例展示了商品搜索与购物车场景的原子化服务实现,以及商品推荐和购物车数量元服务卡片的开发流程。涉及代码结构搭建、Ability 生命周期管理、Widget 组件构建及 module.json5 配置文件修改。最终实现数据动态更新与手势交互,完成轻量化应用的开发与部署。

深海蔚蓝发布于 2026/2/7更新于 2026/5/2320 浏览
鸿蒙原子化服务与元服务卡片开发指南

原子化服务与元服务卡片开发

内容承接与核心价值

本文承接页面路由与组件跳转知识,为后续电商购物车全栈项目铺垫原子化服务和元服务卡片的核心技术。

学习目标:

  • 掌握原子化服务的定义与架构;
  • 实现商品搜索与购物车两个核心业务场景的原子化服务;
  • 理解元服务卡片的原理与实现方式;
  • 开发商品推荐与购物车数量两个元服务卡片;
  • 优化元服务卡片的用户体验(动态更新、手势操作)。

学习重点:

  • 原子化服务的开发流程;
  • 元服务卡片的分类与使用场景;
  • 元服务卡片的开发与部署;
  • 元服务卡片的动态更新与数据同步。

一、原子化服务基础

1.1 原子化服务定义

原子化服务是 HarmonyOS Next 推出的一种全新的应用形态,具有以下特点:

  • 轻量化:无需安装,即点即用;
  • 免安装:通过华为应用市场、负一屏、桌面卡片等入口直接访问;
  • 场景化:针对特定业务场景设计,提供单一功能;
  • 跨设备:支持在超级终端上运行,如手机、平板、智慧屏、手表等。
1.2 原子化服务架构

原子化服务采用单 Ability 架构,由以下部分组成:

  • Ability:负责处理业务逻辑;
  • 页面:负责展示用户界面;
  • 元服务卡片:负责快速访问核心功能;
  • 数据管理:负责数据存储与同步。

二、原子化服务实战

2.1 实战目标

基于 MyFirstHarmonyApp 项目架构,实现以下功能:

  • 商品搜索原子化服务:无需安装,直接搜索商品;
  • 购物车原子化服务:无需安装,直接查看购物车商品;
  • 商品推荐元服务卡片:在桌面展示推荐商品;
  • 购物车数量元服务卡片:在桌面展示购物车商品数量。
2.2 项目结构调整

在 entry/src/main/ets 目录下创建以下文件夹:

  • atomic:存放原子化服务相关代码;
  • widgets:存放元服务卡片相关代码。
2.3 原子化服务实现
1. 商品搜索原子化服务

entry/src/main/ets/atomic/SearchAbility.ets

import hilog from '@ohos.hilog';
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import type AbilityConstant from '@ohos.ability.abilityConstant';
import type Want from '@ohos.app.ability.Want';
import BaseAbility from '../entryability/BaseAbility';

export default class SearchAbility extends BaseAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onWindowStageCreate');
    windowStage.loadContent('pages/SearchPage', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'SEARCH_ABILITY', 'Failed to load content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'SEARCH_ABILITY', 'Succeeded in loading content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy(): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onWindowStageDestroy');
  }

  onForeground(): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onForeground');
  }

  onBackground(): void {
    hilog.info(0x0000, 'SEARCH_ABILITY', '%{public}s', 'SearchAbility onBackground');
  }
}

entry/src/main/ets/entryability/BaseAbility.ets

import hilog from '@ohos.hilog';
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import type AbilityConstant from '@ohos.ability.abilityConstant';
import type Want from '@ohos.app.ability.Want';
import UIAbility from '@ohos.app.ability.UIAbility';
import type Window from '@ohos.window';

export default class BaseAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onDestroy');
  }

  onWindowStageCreate(windowStage: Window.WindowStage): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onWindowStageCreate');
  }

  onWindowStageDestroy(): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onWindowStageDestroy');
  }

  onForeground(): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onForeground');
  }

  onBackground(): void {
    hilog.info(0x0000, 'BASE_ABILITY', '%{public}s', 'BaseAbility onBackground');
  }
}
2.4 元服务卡片实现
1. 商品推荐元服务卡片

entry/src/main/ets/widgets/ProductRecommendWidget.ets

import { GoodsModel } from '../models/HomeModel';
import { goodsData } from '../models/HomeData';
import { RouterUtils } from '../utils/RouterUtils';

@Entry
@Component
struct ProductRecommendWidget {
  @State goodsList: Array<GoodsModel> = goodsData.slice(0, 3);

  build() {
    Grid() {
      ForEach(this.goodsList, (item: GoodsModel) => {
        GridItem() {
          Column({ space: 8 }) {
            Image(item.imageUrl).width('100%').height(120).objectFit(ImageFit.Cover).borderRadius(8);
            Text(item.name).fontSize(14).fontWeight(FontWeight.Bold).textColor('#000000').maxLines(2).ellipsis({ overflow: TextOverflow.Ellipsis });
            Text(`¥${item.price}`).fontSize(16).fontWeight(FontWeight.Bold).textColor('#FF0000');
          }.width('100%').height('auto').padding(8).backgroundColor('#FFFFFF').borderRadius(12).onClick(() => {
            RouterUtils.push('pages/ProductDetailPage', { id: item.id });
          });
        }.width('33.33%').height('auto');
      }, (item: GoodsModel) => item.id.toString());
    }.columnsTemplate('1fr 1fr 1fr').columnsGap(8).rowsGap(8).width('100%').height('auto').padding(8);
  }
}
2. 购物车数量元服务卡片

entry/src/main/ets/widgets/CartCountWidget.ets

import { GlobalStateManager } from '../utils/GlobalState';
import { RouterUtils } from '../utils/RouterUtils';

@Entry
@Component
struct CartCountWidget {
  @State cartCount: number = GlobalStateManager.getInstance().getState().cartCount;

  build() {
    Row({ space: 16 }) {
      Image($r('app.media.cart')).width(24).height(24).objectFit(ImageFit.Contain);
      Text(`购物车:${this.cartCount}`).fontSize(14).textColor('#000000');
      if (this.cartCount > 0) {
        Text(`${this.cartCount}`).fontSize(12).textColor('#FFFFFF').backgroundColor('#FF0000').width(20).height(20).textAlign(TextAlign.Center).borderRadius(10);
      }
    }.width('100%').height('auto').padding(16).backgroundColor('#FFFFFF').borderRadius(12).onClick(() => {
      RouterUtils.push('pages/CartPage');
    });
  }

  aboutToAppear() {
    AppStorage.watch('globalState', () => {
      this.cartCount = GlobalStateManager.getInstance().getState().cartCount;
    });
  }
}

三、项目配置与部署

3.1 配置文件修改
1. module.json5 修改

在 entry/src/main/module.json5 中添加原子化服务与元服务卡片配置:

{
  "module": {
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:icon",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ],
        "orientation": "portrait"
      },
      {
        "name": "SearchAbility",
        "srcEntry": "./ets/atomic/SearchAbility.ets",
        "description": "$string:SearchAbility_desc",
        "icon": "$media:icon",
        "label": "$string:SearchAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ],
        "orientation": "portrait"
      },
      {
        "name": "CartAbility",
        "srcEntry": "./ets/atomic/CartAbility.ets",
        "description": "$string:CartAbility_desc",
        "icon": "$media:icon",
        "label": "$string:CartAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ],
        "orientation": "portrait"
      }
    ],
    "widgets": [
      {
        "name": "ProductRecommendWidget",
        "srcEntry": "./ets/widgets/ProductRecommendWidget.ets",
        "description": "$string:ProductRecommendWidget_desc",
        "icon": "$media:icon",
        "label": "$string:ProductRecommendWidget_label",
        "type": "Home",
        "scheduledUpdateTime": "08:00",
        "updateDuration": 3600
      },
      {
        "name": "CartCountWidget",
        "srcEntry": "./ets/widgets/CartCountWidget.ets",
        "description": "$string:CartCountWidget_desc",
        "icon": "$media:icon",
        "label": "$string:CartCountWidget_label",
        "type": "Home",
        "scheduledUpdateTime": "08:00",
        "updateDuration": 3600
      }
    ],
    "pages": ["pages/Index", "pages/SearchPage", "pages/ProductDetailPage", "pages/CartPage", "pages/OrderPage", "pages/PaymentPage", "pages/LoginPage", "pages/MyPage"]
  }
}
2. strings.json 修改

在 entry/src/main/resources/base/element/string.json 中添加原子化服务与元服务卡片的描述信息:

{
  "string": [
    { "name": "EntryAbility_label", "value": "MyFirstHarmonyApp" },
    { "name": "EntryAbility_desc", "value": "我的第一个鸿蒙应用" },
    { "name": "SearchAbility_label", "value": "商品搜索" },
    { "name": "SearchAbility_desc", "value": "商品搜索原子化服务" },
    { "name": "CartAbility_label", "value": "购物车" },
    { "name": "CartAbility_desc", "value": "购物车原子化服务" },
    { "name": "ProductRecommendWidget_label", "value": "商品推荐" },
    { "name": "ProductRecommendWidget_desc", "value": "商品推荐元服务卡片" },
    { "name": "CartCountWidget_label", "value": "购物车数量" },
    { "name": "CartCountWidget_desc", "value": "购物车数量元服务卡片" }
  ]
}
3.2 项目部署
1. 编译项目

在 DevEco Studio 中点击 Build → Build HAP,编译项目。

2. 部署到设备

将编译后的 HAP 文件部署到鸿蒙设备上。

3. 测试原子化服务
  • 在华为应用市场搜索「商品搜索」或「购物车」,点击进入原子化服务;
  • 在负一屏添加「商品推荐」或「购物车数量」元服务卡片。

目录

  1. 原子化服务与元服务卡片开发
  2. 内容承接与核心价值
  3. 一、原子化服务基础
  4. 1.1 原子化服务定义
  5. 1.2 原子化服务架构
  6. 二、原子化服务实战
  7. 2.1 实战目标
  8. 2.2 项目结构调整
  9. 2.3 原子化服务实现
  10. 1. 商品搜索原子化服务
  11. 2.4 元服务卡片实现
  12. 1. 商品推荐元服务卡片
  13. 2. 购物车数量元服务卡片
  14. 三、项目配置与部署
  15. 3.1 配置文件修改
  16. 1. module.json5 修改
  17. 2. strings.json 修改
  18. 3.2 项目部署
  19. 1. 编译项目
  20. 2. 部署到设备
  21. 3. 测试原子化服务
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI Agent 新范式:基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • AIGC 22 个基本概念详解:从原理到应用
  • HarmonyOS Next DevEco Studio 使用指南:添加 Ability 与服务卡片
  • 机器人未知测量噪声下的扩展卡尔曼滤波 SLAM 实现
  • 2025 电商客服机器人实测:乐言、店小蜜等五家主流品牌对比
  • 电商导购 AI 大语言模型的技术选型与决策
  • Python 基于 Transformer 的时序数据建模与实现详解
  • 人工智能的定义、发展历程与基本分类
  • Flutter 使用 groq_sdk 在 OpenHarmony 上实现 LPU 推理应用
  • C++ io_uring 原理与使用指南
  • 无人机 SLAM 单目深度先验融合实践:基于 lingbot-depth 模型
  • AI 生成论文参考文献存在幻觉风险,如何确保引用真实可靠?
  • C++ 异常处理:理论、栈展开与最佳实践
  • AI 算法基础入门:AI 产品经理核心知识指南
  • CQRS 设计模式详解与简单示例
  • 豆包与国产 AI 工具实战推荐:四本提升应用能力的书籍
  • Spring AI MCP Server 集成与使用指南
  • 使用XML-Agent构建智能决策系统快速入门指南
  • 基于 Unity 2022 与 UXR SDK 的 AR 消消乐游戏开发实践
  • 飞算 JavaAI 核心功能与多场景应用解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online