鸿蒙专家 发表于 2026-6-5 15:00:00

鸿蒙6.0 Ability Kit实战解析:Stage模型与组件开发全攻略

Ability Kit 是鸿蒙(HarmonyOS)应用框架的核心组件,作为应用原子化服务的载体,它定义了应用的呈现方式、交互逻辑和生命周期管理。在鸿蒙 6.0 版本中,Ability Kit 迎来了深度优化:更高效的生命周期调度、增强的跨设备流转能力,以及对 HAR/HSP 模块化开发的原生支持。这些改进为构建复杂分布式应用提供了坚实基础。

本文将从 Stage 模型架构入手,通过可执行代码演示 UIAbility 生命周期、Context 体系、Want 通信机制以及 ExtensionAbility 的后台服务能力,帮助开发者快速掌握鸿蒙 6.0 的组件开发实践。

一、Stage 模型核心架构

鸿蒙应用模型经历了从 FA 模型到 Stage 模型的升级。Stage 模型在鸿蒙 3.0 引入,将应用组件划分为 UIAbility 和 ExtensionAbility 两大类,配合 AbilityStage 组件容器层,实现了更细粒度的资源管控和业务解耦。

Stage 模型采用三层架构:应用层(Application)→ 组件容器层(AbilityStage)→ 组件层(UIAbility / ExtensionAbility)。编译期每个 Module 对应一个 AbilityStage 实例,运行期按需创建 UIAbility 或 ExtensionAbility。核心优势包括多实例支持、精细化资源管控、模块化开发友好(通过 HAR 和 HSP 实现跨模块共享)。

核心概念中,HAP 是最终交付包(Entry / Feature),HAR 是静态共享包(源码编译到依赖方 bundle),HSP 是鸿蒙 6.0 主推的动态共享方案(运行时按需加载)。Context 体系分三层:ApplicationContext(应用级)、AbilityStageContext(模块级)、UIAbilityContext(组件级)。WindowStage 是 Ability 的窗口管理器,每个 UIAbility 对应一个 WindowStage 实例。

二、UIAbility 生命周期实战

UIAbility 生命周期包含六个核心回调:onCreate() → onWindowStageCreate() → onForeground() → onBackground() → onWindowStageDestroy() → onDestroy()。其中 onCreate 适合非 UI 资源初始化(数据库、网络配置);onWindowStageCreate 用于加载页面内容;onForeground / onBackground 对应前台/后台状态切换;onWindowStageDestroy 清理窗口资源;onDestroy 做最终释放。

以下是一个完整的 EntryAbility 实现,展示了每个回调的标准用法:

// EntryAbility.ets - 入口Ability完整实现
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG = 'EntryAbility';
const DOMAIN = 0x0001;

export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(DOMAIN, TAG, 'onCreate called');
    if (launchParam.launchReason === AbilityConstant.LaunchReason.APP_START) {
      hilog.info(DOMAIN, TAG, '应用冷启动');
    } else if (launchParam.launchReason === AbilityConstant.LaunchReason.COLD_START) {
      hilog.info(DOMAIN, TAG, '组件冷启动');
    }
    this.initDatabase();
}

onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(DOMAIN, TAG, 'onWindowStageCreate called');
    windowStage.getMainWindow().then((win) => {
      win.setWindowLayoutFullScreen(true);
    });
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
      hilog.error(DOMAIN, TAG, '页面加载失败: %{public}s', JSON.stringify(err));
      return;
      }
      hilog.info(DOMAIN, TAG, '页面加载成功');
    });
}

onForeground(): void {
    hilog.info(DOMAIN, TAG, 'onForeground - 恢复前台操作');
    AppStorage.setOrCreate('appState', 'foreground');
}

onBackground(): void {
    hilog.info(DOMAIN, TAG, 'onBackground - 进入后台');
    AppStorage.setOrCreate('appState', 'background');
}

onWindowStageDestroy(): void {
    hilog.info(DOMAIN, TAG, 'onWindowStageDestroy - 清理窗口');
}

onDestroy(): void {
    hilog.info(DOMAIN, TAG, 'onDestroy - 执行最终清理');
    this.closeDatabase();
}

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(DOMAIN, TAG, 'onNewWant called');
    if (launchParam.launchReason === AbilityConstant.LaunchReason.START_ABILITY) {
      // 处理新的启动请求
    }
}

private initDatabase(): void {
    hilog.info(DOMAIN, TAG, '初始化数据库连接');
}

private closeDatabase(): void {
    hilog.info(DOMAIN, TAG, '关闭数据库连接');
}
}


UIAbility 支持三种启动模式,通过 module.json5 的 launchType 配置:singleton(单实例)、standard(多实例)、specified(指定实例)。配置示例:

{
"abilities": [
    {
      "name": "EntryAbility",
      "srcEntry": "./ets/entryability/EntryAbility.ets",
      "description": "$string:entryability_desc",
      "icon": "$media:icon",
      "label": "$string:entryability_label",
      "startWindowIcon": "$media:icon",
      "startWindowBackground": "$color:start_window_background",
      "exported": true,
      "launchType": "singleton",
      "skills": [
      {
          "entities": ["entity.system.home"],
          "actions": ["action.system.home"]
      }
      ]
    }
]
}


三、Context 与组件交互

Context 是访问系统能力的入口。三层关系:UIAbilityContext ⊂ AbilityStageContext ⊂ ApplicationContext。子层级可访问父层级全部能力并获得组件特有权限。

在 ArkUI 页面中,使用 getContext(this) 获取当前 UIAbilityContext,然后可启动其他 Ability、获取结果、终止自身等。以下为完整示例:

// ContextDemo.ets - Context使用完整示例
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG = 'ContextDemo';
const DOMAIN = 0x0002;

@Entry
@Component
struct ContextDemo {
private abilityContext = getContext(this) as common.UIAbilityContext;

async startTargetAbility(): Promise<void> {
    let want: Want = {
      bundleName: this.abilityContext.abilityInfo.bundleName,
      abilityName: 'TargetAbility',
      moduleName: this.abilityContext.abilityInfo.moduleName,
      parameters: {
      message: '来自Ability Kit的问候',
      timestamp: Date.now(),
      userData: {
          name: 'HarmonyOS',
          version: '6.0'
      }
      }
    };
    try {
      this.abilityContext.startAbility(want, (err: BusinessError) => {
      if (err.code) {
          hilog.error(DOMAIN, TAG, '启动失败: %{public}s', err.message);
          return;
      }
      hilog.info(DOMAIN, TAG, 'TargetAbility启动成功');
      });
    } catch (err) {
      let error = err as BusinessError;
      hilog.error(DOMAIN, TAG, '启动异常: %{public}d %{public}s', error.code, error.message);
    }
}

async startByImplicitWant(): Promise<void> {
    let want: Want = {
      action: 'ohos.want.action.viewData',
      entities: ['entity.system.browser'],
      uri: 'https://www.example.com'
    };
    try {
      await this.abilityContext.startAbility(want);
    } catch (err) {
      let error = err as BusinessError;
      hilog.error(DOMAIN, TAG, '隐式启动失败: %{public}d', error.code);
    }
}

async startForResult(): Promise<void> {
    let want: Want = {
      bundleName: 'com.example.target',
      abilityName: 'ResultAbility',
      parameters: {
      requestCode: 'SELECT_IMAGE'
      }
    };
    this.abilityContext.startAbilityForResult(want).then((result) => {
      if (result.resultCode === 0) {
      hilog.info(DOMAIN, TAG, '获取结果: %{public}s', JSON.stringify(result.want?.parameters));
      }
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN, TAG, '获取结果失败: %{public}s', err.message);
    });
}

terminateCurrent(): void {
    this.abilityContext.terminateSelf();
}

terminateWithResult(): void {
    let want: Want = {
      parameters: {
      result: '操作完成',
      success: true
      }
    };
    this.abilityContext.terminateSelfWithResult(want);
}

getAppContext(): void {
    let appContext = this.abilityContext.getApplicationContext();
    hilog.info(DOMAIN, TAG, '应用ID: %{public}s', appContext.info.bundleName);
}

build() {
    Column({ space: 16 }) {
      Text('Context 操作演示')
      .fontSize(24).fontWeight(FontWeight.Bold).width('100%').textAlign(TextAlign.Center);
      Divider().color('#E0E0E0');
      Column({ space: 12 }) {
      Text('启动Ability').fontSize(16).fontWeight(FontWeight.Medium).width('100%');
      Button('显式启动目标Ability').width('100%').height(48)
          .onClick(() => this.startTargetAbility());
      Button('隐式启动浏览器').width('100%').height(48)
          .onClick(() => this.startByImplicitWant());
      Button('启动并获取结果').width('100%').height(48).type(ButtonType.Normal)
          .onClick(() => this.startForResult());
      }
      Divider().color('#E0E0E0').margin({ top: 16, bottom: 16 });
      Column({ space: 12 }) {
      Text('终止操作').fontSize(16).fontWeight(FontWeight.Medium).width('100%');
      Button('终止当前Ability').width('100%').height(48).backgroundColor(Color.Red)
          .onClick(() => this.terminateCurrent());
      Button('携带结果终止').width('100%').height(48).backgroundColor(Color.Orange)
          .onClick(() => this.terminateWithResult());
      }
      Divider().color('#E0E0E0').margin({ top: 16, bottom: 16 });
      Button('获取应用Context').width('100%').height(48).type(ButtonType.Normal)
      .onClick(() => this.getAppContext());
    }
    .padding(20).width('100%').height('100%');
}
}


四、Want 通信机制

Want 是 HarmonyOS 组件间通信的核心载体,包含 bundleName、abilityName、moduleName、uri、action、entities、parameters 等字段。显式 Want 直接指定包名和能力名;隐式 Want 通过 action/entities/uri 让系统匹配,适用于跨应用调用。

以下演示显式 Want 和隐式 Want 的使用:

// WantStructDemo.ets - Want使用示例
import { Want, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WantStructDemo {
private context = getContext(this) as common.UIAbilityContext;

startExplicitAbility(): void {
    const want: Want = {
      bundleName: 'com.example.myapp',
      abilityName: 'DetailAbility',
      moduleName: 'entry',
      parameters: {
      id: '12345',
      type: 'product',
      from: 'list'
      }
    };
    this.context.startAbility(want)
      .then(() => console.info('显式启动成功'))
      .catch((err: BusinessError) => console.error(`启动失败: ${err.code}`));
}

startImplicitAbility(): void {
    const want: Want = {
      action: 'ohos.want.action.viewData',
      entities: ['entity.system.browsable'],
      uri: 'https://www.harmonyos.com',
      type: 'text/plain',
      parameters: {
      key: 'customValue'
      }
    };
    this.context.startAbility(want)
      .then(() => console.info('隐式启动成功'))
      .catch((err: BusinessError) => console.error(`隐式启动失败: ${err.code}`));
}

build() {
    Column({ space: 20 }) {
      Text('Want 通信机制演示').fontSize(20).fontWeight(FontWeight.Bold);
      Button('显式启动').onClick(() => this.startExplicitAbility());
      Button('隐式启动').onClick(() => this.startImplicitAbility());
    }.padding(20);
}
}


五、ExtensionAbility 扩展能力

ExtensionAbility 用于实现后台服务、自定义功能等。以 ServiceExtensionAbility 为例,它支持长时间运行的 background 任务和跨进程通信。以下示例展示了后台服务 Ability 的实现,通过 RPC 与客户端通信:

// MyServiceExtensionAbility.ets - 后台服务Ability
import { ServiceExtensionAbility, Want, AbilityConstant } from '@kit.AbilityKit';
import { rpc } from '@kit.IPCKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG = 'MyServiceExtension';
const DOMAIN = 0x0003;

class MyRemoteStub extends rpc.RemoteStub {
onRemoteRequest(code: number, data: rpc.MessageParcel): boolean {
    hilog.info(DOMAIN, TAG, '收到请求: code=%{public}d', code);
    switch (code) {
      case 1: // 获取数据
      let response = data.readString();
      hilog.info(DOMAIN, TAG, '客户端数据: %{public}s', response);
      break;
      default:
      return false;
    }
    return true;
}
}


实际开发中,需在 module.json5 中声明 extensionAbility,并配置后台权限。ServiceExtensionAbility 常与前台 UIAbility 配合,通过 Want 通信交互,适合处理下载、数据同步等后台任务。

总结
鸿蒙 6.0 的 Ability Kit 在 Stage 模型基础上,提供了更加精细的生命周期管理、灵活的 Context 体系以及强大的 Want 通信机制。通过本文提供的完整代码示例,开发者可以快速搭建起具备多实例、模块化、跨组件通信能力的应用。后续实践中,可结合最新 HSP 动态加载技术,进一步优化大型应用的结构和包体积。

热心网友7 发表于 2026-6-5 15:05:00

Re: 鸿蒙6.0 Ability Kit实战解析:Stage模型与组件开发全攻略

感谢楼主分享这么详细的实战解析!代码示例很清晰,特别是 onCreate 里区分冷启动类型和 onWindowStageCreate 设置全屏的逻辑,很实用。想请教一下楼主,在鸿蒙 6.0 中,HSP 动态共享包和之前的 HAR 包在使用上有什么特别注意的地方吗?另外帖子提到增强的跨设备流转能力,能否再具体说说在代码层面是怎么对接 Want 通信来实现的?期待后续更多干货!

热心网友4 发表于 2026-6-22 22:00:00

Re: 鸿蒙6.0 Ability Kit实战解析:Stage模型与组件开发全攻略

楼主的解析非常详尽,尤其是 Stage 模型三层架构和生命周期各回调的职责划分讲得很透彻。代码示例也很完整,对 `onWindowStageCreate` 里设置全屏和加载页面的处理很实用。有一个小问题想请教:在 `onCreate` 里做数据库初始化,如果应用重启时 `launchReason` 是 `APP_START` 和 `COLD_START` 两种场景,初始化逻辑是否有区别?另外 HSP 动态共享包在 6.0 中是否对跨模块的 UI 组件有特别要求?期待后续关于 ExtensionAbility 的实战内容。

热心网友5 发表于 2026-6-22 22:10:00

Re: 鸿蒙6.0 Ability Kit实战解析:Stage模型与组件开发全攻略

感谢楼主这么详细的实战解析!Stage 模型的三层架构和生命周期回调的代码示例都很清晰,尤其是 `onWindowStageCreate` 里设置全屏和加载页面的写法,直接可以上手用。有个小问题想请教:在 `onNewWant` 回调中,如果应用已经在后台,此时收到新的 Want 启动参数,通常会怎么正确处理页面跳转或数据刷新?期待楼主后续能补充一下跨设备流转或 ExtensionAbility 的例子,很感兴趣。
页: [1]
查看完整版本: 鸿蒙6.0 Ability Kit实战解析:Stage模型与组件开发全攻略