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 动态加载技术,进一步优化大型应用的结构和包体积。 |