HarmonyOS 创建项目 Application和Atomic Service 的区别

5 阅读3分钟

核心概念对比

表格

特性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页面

使用场景对比

表格

场景ApplicationAtomic 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%')
  }
}

编译产物差异

表格

项目ApplicationAtomic Service
HAP类型type: "entry"type: "atomicService"
安装包标识普通APPatomicService标记
上架审核应用市场常规审核需符合原子化服务规范
包大小限制较宽松(几百MB)严格限制(通常<10MB)
后台策略常规保活更严格限制,即用即走

选择建议

plain

复制

需要创建 Atomic Service 的情况:
✅ 功能单一聚焦(如:计算器、汇率转换、快递查询)
✅ 使用频次低但急需(如:临时翻译、偶尔查询)
✅ 场景化触发(IoT控制、扫码支付、NFC场景)
✅ 希望降低用户使用门槛(免安装、一步直达)
✅ 作为其他应用的辅助服务

需要创建 Application 的情况:
❌ 功能复杂、页面多、需要强用户粘性
❌ 需要常驻后台(IM、音乐播放)
❌ 需要完整账号体系、社交功能
❌ 需要大量本地存储和权限

混合模式(推荐)

现代鸿蒙应用通常采用 Application + Atomic Service 卡片 的混合架构:

plain

复制

┌─────────────────────────────────────┐
│         Application(主应用)         │
│  ┌─────────────────────────────┐   │
│  │  Atomic Service 卡片入口     │   │
│  │  • 桌面卡片 → 快捷功能        │   │
│  │  • 服务中心 → 免安装体验        │   │
│  │  • 扫码/NFC → 场景化触发      │   │
│  └─────────────────────────────┘   │
│           ↓ 引导下载完整版           │
│  ┌─────────────────────────────┐   │
│  │    完整Application功能        │   │
│  │  • 深度功能 • 账号体系 • 社交  │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

这样既通过原子化服务降低获客门槛,又通过完整应用提供深度价值。