Skip to content

原子化服务进阶

1. 原子化服务概述

1.1 什么是原子化服务

原子化服务(Atomic Service)是鸿蒙的核心特色:

核心概念:
├── 免安装:用户不需要安装,即点即用
├── 元服务(Meta Service):原子化服务的上层概念
├── 服务卡片(Service Widget):元服务的入口
├── 场景化分发:根据场景自动推荐服务
└── 跨端流转:服务可在不同设备间无缝迁移

1.2 与传统应用的对比

维度传统应用(HAP)原子化服务
安装需要下载安装免安装,即点即用
包体积较大(通常 > 10MB)轻量(通常 < 5MB)
启动速度较慢(需要冷启动)快(直接加载)
使用方式从桌面图标启动卡片/搜索/场景触发
生命周期独立应用生命周期卡片/服务生命周期
分发渠道AppGallery 应用市场元服务市场/场景化分发
更新应用商店更新静默更新(无感)
安装位置/data/app//data/atomic/

2. 元能力架构

2.1 元能力(Meta Capability)

元能力是原子化服务的能力描述框架:

┌──────────────────────────────────────────────────┐
│  元能力类型                                     │
│  ├── 展示能力:展示内容(文本/图片/卡片)          │
│  ├── 交互能力:用户交互(点击/滑动/输入)          │
│  ├── 数据能力:数据获取/处理/存储                │
│  ├── 设备能力:调用设备功能(相机/位置/传感器)    │
│  ├── 分发能力:服务分发/推荐/搜索                │
│  └── 连接能力:网络/分布式/设备连接               │
└──────────────────────────────────────────────────┘

2.2 元服务架构

元服务分层架构:
┌──────────────────────────────────────────────────┐
│  元服务入口                                     │
│  ├── 服务卡片(Service Widget)                   │
│  ├── 万能卡片(Form)                            │
│  └── 搜索推荐(Search)                          │
├──────────────────────────────────────────────────┤
│  元服务能力层                                    │
│  ├── ArkUI 组件库(元服务能力组件)              │
│  ├── 元服务 API(元能力调用)                    │
│  └── 场景引擎(场景识别/推荐)                   │
├──────────────────────────────────────────────────┤
│  元服务运行时                                    │
│  ├── 元服务框架(元能力运行时)                   │
│  ├── 元服务分发器(场景化分发)                   │
│  └── 元服务管理(安装/更新/卸载)                │
└──────────────────────────────────────────────────┘

2.3 元能力开发

arkts
// 1. 声明元服务能力
// module.json5
{
  "module": {
    "metadata": [
      {
        "name": "atomicService",
        "type": "feature",
        "description": "元服务描述"
      }
    ],
    "metaInfo": [
      {
        "name": "widget",
        "config": {
          "formBindingData": {
            "title": "元服务标题"
          },
          "supportDimensions": ["2x2", "2x4"]
        }
      }
    ]
  }
}

// 2. 创建元服务页面
@Entry
@Component
struct AtomicServicePage {
  @State title: string = '元服务';
  @State count: number = 0;

  build() {
    Column() {
      Text(this.title)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)

      Button('点击次数: ' + this.count)
        .onClick(() => {
          this.count += 1;
        })

      Button('跳转到完整应用')
        .onClick(() => {
          // 从元服务跳转到完整应用
          router.pushUrl({
            url: 'pages/FullApp'
          });
        })
    }
  }
}

3. 免安装方案

3.1 免安装原理

免安装流程:
┌────────────────────────────────────────────────────┐
│  1. 用户触发(卡片/搜索/场景)                      │
│     → 元服务发现引擎匹配                            │
├────────────────────────────────────────────────────┤
│  2. 下载元服务包(轻量 HAP)                        │
│     → 只下载元服务部分(不下载完整应用)             │
│     → 增量更新,体积更小                            │
├────────────────────────────────────────────────────┤
│  3. 沙箱中运行                                     │
│     → 独立的沙箱目录                               │
│     → 独立的 TokenID                              │
│     → 完整的系统权限                                │
├────────────────────────────────────────────────────┤
│  4. 生命周期管理                                   │
│     → 卡片隐藏/显示                                │
│     → 后台保活                                     │
│     → 自动清理(长时间不用的元服务)                  │
└────────────────────────────────────────────────────┘

3.2 元服务卡片

arkts
import { formInfo, formBindingData } from '@kit.FormKit';

// 1. 创建元服务卡片
@Entry
@Component
@CustomEntity('MyWidget', 'MyWidgetForm')
struct MyWidget {
  @State data: WidgetData = { title: '', value: 0 };

  aboutToAppear() {
    // 从元服务框架获取数据
    formInfo.getFormInfo((data: formBindingData.FormBindingData) => {
      this.data = data.getValue('data') as WidgetData;
    });
  }

  build() {
    Column() {
      Text(this.data.title)
        .fontSize(20)

      Text(String(this.data.value))
        .fontSize(40)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Red)
    }
    .width('100%')
    .height('100%')
    .borderRadius(16)
    .backgroundColor(Color.White)
    .padding(16)
  }
}

// 2. 卡片配置
interface WidgetConfig {
  title: string;
  type: string;
  size: [number, number];  // 2x2 / 2x4
  refreshRate: number;  // 更新频率(分钟)
  isPreheat: boolean;  // 是否预热
}

// 3. 卡片数据更新
async function updateWidgetData(widgetId: number, data: WidgetData) {
  // 通过元服务框架更新卡片数据
  const updateResult = await formInfo.updateForm(widgetId, {
    data: data
  });
}

3.3 元服务生命周期

元服务卡片生命周期:
┌─────────────────────────────────────────────────────┐
│  onFormVisible — 卡片显示(用户可见)               │
│  → 开始数据刷新                                    │
│  → 启动数据拉取                                    │
├─────────────────────────────────────────────────────┤
│  onFormHidden — 卡片隐藏(用户不可见)              │
│  → 暂停数据刷新(减少功耗)                          │
│  → 缓存最新数据                                    │
├─────────────────────────────────────────────────────┤
│  onFormClick — 卡片点击                            │
│  → 跳转到对应页面                                  │
│  → 执行对应操作                                    │
├─────────────────────────────────────────────────────┤
│  onFormDelete — 卡片删除                            │
│  → 清理资源                                        │
│  → 停止数据刷新                                    │
└─────────────────────────────────────────────────────┘

4. 场景化分发

4.1 场景引擎

场景化分发原理:
┌─────────────────────────────────────────────────────┐
│  场景识别引擎                                       │
│  ├── 时间感知:根据时间推荐服务(早高峰→交通)       │
│  ├── 位置感知:根据位置推荐服务(商场→优惠)         │
│  ├── 行为感知:根据行为推荐服务(搜索→相关服务)     │
│  ├── 设备感知:根据设备推荐服务(车机→车载服务)     │
│  └── 社交感知:根据社交关系推荐服务                  │
├─────────────────────────────────────────────────────┤
│  分发策略                                           │
│  ├── 精准推荐:基于用户画像的个性化推荐              │
│  ├── 热度排名:基于使用频率的排行榜                  │
│  └── 关联推荐:基于服务关联度的推荐                  │
└─────────────────────────────────────────────────────┘

4.2 场景化分发配置

json5
// Ability 的 skills 配置,定义服务入口
{
  "abilities": [
    {
      "name": "EntryAbility",
      "srcEntry": "./ets/entry/EntryAbility.ets",
      "description": "元服务入口",
      "skills": [
        {
          "entities": ["entity.system.home"],  // 桌面场景
          "actions": ["action.system.home"],
          "uris": [
            {
              "scheme": "atomic",
              "host": "myapp",
              "pathPrefix": "/widget"
            }
          ]
        },
        {
          "entities": ["entity.system.search"],  // 搜索场景
          "actions": ["action.system.search"],
          "metadata": [
            {
              "name": "searchKeyword",
              "resource": "json/default/search_keyword.json"
            }
          ]
        }
      ]
    }
  ]
}

5. 元服务 vs 传统应用开发

5.1 开发差异

维度传统应用元服务
入口组件UIAbilityFormExtensionAbility
UI 构建完整页面卡片布局
包结构完整 HAP轻量 HAP
生命周期Ability 生命周期卡片生命周期
更新方式应用商店更新静默更新
分发渠道AppGallery元服务市场 + 场景化
代码体积较大较小
启动方式图标点击卡片/搜索/场景触发

5.2 元服务打包

bash
# 元服务构建配置
# build-profile.json5
{
  "modules": [
    {
      "name": "entry",
      "srcEntry": "./ets/entry/EntryAbility.ets",
      "destPath": "./entry",
      "metadata": [
        {
          "name": "atomicService",
          "type": "feature"
        }
      ]
    }
  ]
}

6. 🎯 面试高频考点

Q1: 元服务的核心特点是什么?

答要点

  • 免安装:即点即用,无需下载完整应用
  • 卡片入口:通过服务卡片/万能卡片访问
  • 场景化分发:根据时间/位置/行为等场景自动推荐
  • 轻量包:只包含元服务部分,体积小
  • 跨端流转:可跨设备迁移
  • 静默更新:无感更新,用户无感知

Q2: 元服务的生命周期如何管理?

答要点

  • onFormVisible:卡片显示,开始数据刷新
  • onFormHidden:卡片隐藏,暂停刷新
  • onFormClick:卡片点击,跳转页面
  • onFormDelete:卡片删除,清理资源
  • 卡片生命周期与应用生命周期解耦

Q3: 元服务与传统应用的区别?

答要点

  • 安装方式:免安装 vs 需要安装
  • 入口:卡片/搜索 vs 桌面图标
  • 包体积:轻量(< 5MB) vs 完整(> 10MB)
  • 分发:场景化 vs 应用市场
  • 更新:静默 vs 应用商店更新
  • 适用场景:简单功能 vs 复杂应用

💡 面试提示:元服务是鸿蒙区别于其他平台的核心特色。重点掌握 免安装原理卡片生命周期场景化分发机制。强调元服务在 IoT 生态中的价值。