核心概念对比
表格
| 特性 | Application(应用) | Atomic Service(原子化服务) |
|---|---|---|
| 定位 | 传统完整应用 | 轻量化、即用即走的服务 |
| 安装方式 | 需显式安装到设备 | 免安装,点击即用 |
| 桌面图标 | 有固定图标 | 无固定图标,通过卡片/搜索/扫码触发 |
| 用户感知 | 强感知(主动打开APP) | 弱感知(场景化触发) |
| 功能粒度 | 大而全 | 小而精,聚焦单一功能 |
| 分发渠道 | 应用市场 | 应用市场 + 服务中心 + 场景化入口 |
架构本质区别
plain
复制
┌─────────────────────────────────────────────────────────┐
│ Application(传统应用) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Entry │ │ Feature │ │ Feature │ ...多个HAP模块 │
│ │ HAP │ │ HAP 1 │ │ HAP 2 │ │
│ │ (入口) │ │(功能A) │ │(功能B) │ │
│ └────┬────┘ └─────────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ 完整应用生命周期:安装→打开→使用→关闭 │ │
│ │ 用户主动管理:桌面图标、后台任务 │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Atomic Service(原子化服务) │
│ ┌─────────────────────────────────────┐ │
│ │ 单个Entry HAP(极简) │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Form │ │ Ability │ (可选) │ │
│ │ │ (卡片) │ │ (页面) │ │ │
│ │ └────┬────┘ └─────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 核心:通过卡片交互,无需打开完整页面 │ │
│ └─────────────────────────────────────┘ │
│ │
│ 触发方式: │
│ • 服务中心搜索 │
│ • 扫一扫二维码 │
│ • NFC碰一碰 │
│ • 系统场景推荐(如快递提醒→查快递服务) │
│ • 其他应用跳转 │
└─────────────────────────────────────────────────────────┘
项目创建时的关键差异
1. 创建向导选项
plain
复制
DevEco Studio → Create Project
├─ Empty Ability → 传统Application
├─ [CloudDev]... → 带云开发的传统应用
│
├─ Atomic Service Ability → ⭐ 原子化服务(无图标)
├─ [CloudDev]Atomic Service → 带云开发的原子化服务
│
└─ ... 其他模板
2. 配置文件核心差异
Application: module.json5
json5
复制
{
"module": {
"name": "entry",
"type": "entry", // 传统入口
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone",
"tablet",
"2in1"
],
"deliveryWithInstall": true,
"installationFree": false, // ❌ 需要安装
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"icon": "$media:icon", // 有图标
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background"
}
]
}
}
Atomic Service: module.json5
json5
复制
{
"module": {
"name": "entry",
"type": "atomicService", // ⭐ 关键区别:atomicService类型
"description": "$string:module_desc",
"deviceTypes": [
"phone"
],
"deliveryWithInstall": true,
"installationFree": true, // ✅ 免安装
// ⭐ 核心:卡片驱动
"forms": [ // 卡片配置(必须有)
{
"name": "WidgetCard",
"displayName": "$string:CardDisplayName",
"description": "$string:CardDescription",
"src": "./ets/widget/pages/WidgetCard.ets",
"uiSyntax": "arkts",
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
"colorMode": "auto",
"isDefault": true,
"updateEnabled": false,
"scheduledUpdateTime": "10:30",
"updateDuration": 1,
"defaultDimension": "2*2", // 卡片尺寸
"supportDimensions": ["2*2"] // 支持尺寸
}
],
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
// ⭐ 注意:原子化服务通常没有桌面图标
// 或图标仅用于服务中心展示
"icon": "$media:icon",
"label": "$string:EntryAbility_label"
}
]
}
}
3. AppScope/app.json5 差异
Application
json5
复制
{
"app": {
"bundleName": "com.example.myapp",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon", // 应用图标(桌面显示)
"label": "$string:app_name", // 应用名称(桌面显示)
"distributedNotificationEnabled": true
}
}
Atomic Service
json5
复制
{
"app": {
"bundleName": "com.example.myservice",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon", // 服务中心展示图标
"label": "$string:app_name", // 服务中心展示名称
// ⭐ 原子化服务特有配置
"atomicService": { // ✅ 标记为原子化服务
"splitMode": 1, // 分包模式
"mainModule": "entry",
"installationFree": true // 免安装
}
}
}
代码结构差异
Application 典型结构
plain
复制
MyApplication/
├── entry/src/main/
│ ├── ets/
│ │ ├── entryability/
│ │ │ └── EntryAbility.ets # 主Ability(页面跳转)
│ │ ├── pages/
│ │ │ ├── Index.ets # 首页
│ │ │ ├── Detail.ets # 详情页
│ │ │ └── Settings.ets # 设置页
│ │ └── ...
│ └── resources/
Atomic Service 典型结构
plain
复制
MyAtomicService/
├── entry/src/main/
│ ├── ets/
│ │ ├── entryability/
│ │ │ └── EntryAbility.ets # 可选:复杂交互时打开
│ │ ├── widget/
│ │ │ └── pages/
│ │ │ └── WidgetCard.ets # ⭐ 卡片页面(核心)
│ │ └── ...
│ └── resources/
│
└── 核心特点:
• 卡片即服务主体
• 用户通过卡片完成80%操作
• 必要时才跳转Ability页面
使用场景对比
表格
| 场景 | Application | Atomic Service |
|---|---|---|
| 复杂工具 | 微信、WPS、美图秀秀 | ❌ 不适合 |
| 高频社交 | 抖音、小红书 | ❌ 不适合 |
| 即时查询 | ❌ 太重 | ✅ 查快递、查天气、查汇率 |
| 快捷支付 | ❌ 需打开APP | ✅ 付款码、扫码点餐 |
| IoT控制 | ❌ 步骤繁琐 | ✅ 控制台灯、空调、门锁 |
| 内容消费 | 新闻APP、视频APP | ✅ 单篇文章、单个视频 |
| 生活服务 | 美团、滴滴 | ✅ 单车扫码、临时打车 |
卡片(Form)核心机制
TypeScript
复制
// WidgetCard.ets - 原子化服务的核心
@Entry
@Component
struct WidgetCard {
@LocalStorageProp('formId') formId: string = '';
@LocalStorageProp('width') width: number = 0;
@LocalStorageProp('height') height: number = 0;
// 卡片生命周期
onAddForm() {
// 卡片添加到桌面/服务中心
}
onUpdateForm() {
// 卡片数据更新
}
onRemoveForm() {
// 卡片移除
}
build() {
Column() {
// ⭐ 卡片UI:简洁、信息直达、一键操作
Text('今日天气')
.fontSize(16)
Row() {
Image($r('app.media.weather_icon'))
.width(40)
Text('25°C')
.fontSize(24)
}
Button('查看详情')
.onClick(() => {
// 跳转到Ability或触发服务
postCardAction(this, {
'action': 'router',
'abilityName': 'EntryAbility',
'params': { 'targetPage': 'detail' }
});
})
}
.width('100%')
.height('100%')
}
}
编译产物差异
表格
| 项目 | Application | Atomic Service |
|---|---|---|
| HAP类型 | type: "entry" | type: "atomicService" |
| 安装包标识 | 普通APP | 带atomicService标记 |
| 上架审核 | 应用市场常规审核 | 需符合原子化服务规范 |
| 包大小限制 | 较宽松(几百MB) | 严格限制(通常<10MB) |
| 后台策略 | 常规保活 | 更严格限制,即用即走 |
选择建议
plain
复制
需要创建 Atomic Service 的情况:
✅ 功能单一聚焦(如:计算器、汇率转换、快递查询)
✅ 使用频次低但急需(如:临时翻译、偶尔查询)
✅ 场景化触发(IoT控制、扫码支付、NFC场景)
✅ 希望降低用户使用门槛(免安装、一步直达)
✅ 作为其他应用的辅助服务
需要创建 Application 的情况:
❌ 功能复杂、页面多、需要强用户粘性
❌ 需要常驻后台(IM、音乐播放)
❌ 需要完整账号体系、社交功能
❌ 需要大量本地存储和权限
混合模式(推荐)
现代鸿蒙应用通常采用 Application + Atomic Service 卡片 的混合架构:
plain
复制
┌─────────────────────────────────────┐
│ Application(主应用) │
│ ┌─────────────────────────────┐ │
│ │ Atomic Service 卡片入口 │ │
│ │ • 桌面卡片 → 快捷功能 │ │
│ │ • 服务中心 → 免安装体验 │ │
│ │ • 扫码/NFC → 场景化触发 │ │
│ └─────────────────────────────┘ │
│ ↓ 引导下载完整版 │
│ ┌─────────────────────────────┐ │
│ │ 完整Application功能 │ │
│ │ • 深度功能 • 账号体系 • 社交 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
这样既通过原子化服务降低获客门槛,又通过完整应用提供深度价值。