Appearance
原子化服务进阶
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 开发差异
| 维度 | 传统应用 | 元服务 |
|---|---|---|
| 入口组件 | UIAbility | FormExtensionAbility |
| 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 生态中的价值。