# 空间事件订阅

从API版本6.0.0(20)开始，支持订阅和取消订阅空间事件的能力。

## 场景介绍

Enterprise Space Kit为应用提供订阅空间事件的能力。订阅空间切换事件后，应用将在空间切换时收到通知，并执行预设的自定义动作。同时，也提供取消订阅空间事件的能力，支持应用在特定场景下灵活管理空间事件的订阅状态。

## 接口说明

详细接口说明可参考[接口文档](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/enterprisespace-spacemanager)。

|接口名|描述|
|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------|
|[subscribeEvent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/enterprisespace-spacemanager#subscribeevent)(eventId: [EventType](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/enterprisespace-spacemanager#eventtype)[], callback: AsyncCallback<[EventData](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/enterprisespace-spacemanager#eventdata)>): number|订阅空间事件，在相关事件触发时，通知应用侧。|
|[unsubscribeEvent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/enterprisespace-spacemanager#unsubscribeevent)(subscribeId: number): void|取消订阅空间事件，在相关事件触发时，不再通知应用侧。|

## 开发步骤

1.导入空间事件订阅API模块相关依赖。

```TypeScript
import { AsyncCallback } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { spaceManager } from '@kit.EnterpriseSpaceKit';
import { ErrCode } from '../../common/ErrCode';
```

2.空间事件订阅API接口封装。

```TypeScript
const TAG = '[Sample_SpaceManagerSample]';
const DOMAIN = 0xF811;

export class SubscribeSpaceEventApi {
  static subscribeEvent(eventIds: spaceManager.EventType[], callback: AsyncCallback<spaceManager.EventData>): number {
    try {
      const subscribeId = spaceManager.subscribeEvent(eventIds, callback);
      hilog.info(DOMAIN, TAG, `Succeeded in subscribing event. subscribeId: ${subscribeId}`);
      return ErrCode.OK;
    } catch (err) {
      hilog.error(DOMAIN, TAG, `Failed to subscribe event. Code: ${err.code}, message: ${err.message}`);
      return ErrCode.ERR;
    }
  }

  static unsubscribeEvent(subscribeId: number): void {
    try {
      spaceManager.unsubscribeEvent(subscribeId);
      hilog.info(DOMAIN, TAG, 'Succeeded in unsubscribing event');
    } catch (err) {
      hilog.error(DOMAIN, TAG, `Failed to unsubscribe event. Code: ${err.code}, message: ${err.message}`);
    }
  }
}
```

3.导入空间事件订阅业务实现相关依赖。

```TypeScript
import { router } from '@kit.ArkUI';
import { spaceManager } from '@kit.EnterpriseSpaceKit';
import { SubscribeSpaceEventApi } from '../api/SubscribeSpaceEventApi'
import { ErrCode } from '../../common/ErrCode';
import { hilog } from '@kit.PerformanceAnalysisKit';
```

4.空间事件订阅业务相关实现。

```TypeScript
const TAG = '[Sample_SpaceManagerSample]';
const DOMAIN = 0xF811;

@Entry
@Component
struct SubscribeSpaceEventPage {
  subscribe() {
    let eventIds: spaceManager.EventType[] = [spaceManager.EventType.EVENT_WORKSPACE_SWITCHED];
    let callBack = (error: BusinessError, data: spaceManager.EventData) => {
      if (error) {
        hilog.error(DOMAIN, TAG, `error info:${error?.code}, err message:${error?.message}`);
      } else {
        hilog.info(DOMAIN, TAG, `event: ${data.event},currentWorkSpaceId: ${data.currentWorkspaceId}`);
        // 处理事件
      }
    };
    if (SubscribeSpaceEventApi.subscribeEvent(eventIds, callBack) !== ErrCode.OK) {
      // 订阅失败处理
      hilog.error(DOMAIN, TAG, 'Failed to subscribe event!');
      return;
    }

    // 订阅成功处理
  }

  unSubscribe() {
    let subscribeId = 100; // 由订阅空间事件得到的订阅ID。
    SubscribeSpaceEventApi.unsubscribeEvent(subscribeId);
  }

  build() {
    Column() {
      Row() {
        Button($r('app.string.subscribe'))
          .buttonCommonStyle()
          .onClick(() => {
            this.subscribe();
          })
      }

      Row() {
        Button($r('app.string.unSubscribe'))
          .buttonCommonStyle()
          .onClick(() => {
            this.unSubscribe();
          })
      }

      Row() {
        Button($r('app.string.back'))
          .buttonCommonStyle()
          .onClick(() => {
            router.back();
          })
      }
    }
  }
}

@Extend(Button)
function buttonCommonStyle() {
  .width(200)
  .height(50)
  .backgroundColor('#6366F1')
  .fontColor('#FFFFFF')
  .fontSize(14)
  .margin({ left: 20, bottom: 5 })
}
```

