common-event.md 6.9 KB
Newer Older
Z
zengsiyu 已提交
1
# 公共事件开发指导
2
## 简介
Z
zengsiyu 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15
OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。

公共事件可分为系统公共事件和自定义公共事件。

+ 系统公共事件:系统将收集到的事件信息,根据系统策略发送给订阅该事件的用户程序。 例如:系统关键服务发布的系统事件(例如:hap安装,更新,卸载等)。

+ 自定义公共事件:应用自定义一些公共事件用来实现跨应用的事件通信能力。

每个应用都可以按需订阅公共事件,订阅成功且公共事件发布,系统会把其发送给应用。这些公共事件可能来自系统、其他应用和应用自身。

## 公共事件订阅开发指导

### 场景介绍
Z
zengsiyu 已提交
16
当需要订阅某个公共事件,获取某个公共事件传递的参数时,可以创建一个订阅者对象,用于作为订阅公共事件的载体,订阅公共事件并获取公共事件传递而来的参数。订阅部分系统公共事件需要先申请权限,订阅这些事件所需要的权限请见[公共事件权限列表](../reference/apis/js-apis-commonEvent.md#权限列表)
Z
zengsiyu 已提交
17 18 19 20

### 接口说明
| 接口名                                                                                          | 接口描述 |
| ---------------------------------------------------------------------------------------------- | ----------- |
F
fangJinliang1 已提交
21 22 23
| createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback) | 创建订阅者对象(callback) |
| createSubscriber(subscribeInfo: CommonEventSubscribeInfo)                          | 创建订阅者对象(promise)  |
| subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback)              | 订阅公共事件 |
Z
zengsiyu 已提交
24 25 26 27

### 开发步骤
1. 导入CommonEvent模块。

战场小包's avatar
战场小包 已提交
28
```js
Z
zengsiyu 已提交
29 30 31
import commonEvent from '@ohos.commonEvent';
```

Z
zengsiyu 已提交
32
2. 创建订阅者信息,详细的订阅者信息数据类型及包含的参数请见[CommonEventSubscribeInfo文档](../reference/apis/js-apis-commonEvent.md#commoneventsubscribeinfo)介绍。
Z
zengsiyu 已提交
33

战场小包's avatar
战场小包 已提交
34
```js
F
fangJinliang1 已提交
35 36
//用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
private subscriber = null
Z
zengsiyu 已提交
37 38 39 40 41 42 43 44 45

//订阅者信息
var subscribeInfo = {
    events: ["event"],
}
```

3. 创建订阅者,保存返回的订阅者对象subscriber,用于执行后续的订阅、退订等操作。

战场小包's avatar
战场小包 已提交
46
```js
Z
zengsiyu 已提交
47 48 49 50 51 52 53 54 55 56 57 58
//创建订阅者回调
commonEvent.createSubscriber(subscribeInfo, (err, subscriber) => {
    if (err.code) {
        console.error("[CommonEvent]CreateSubscriberCallBack err=" + JSON.stringify(err))
    } else {
        console.log("[CommonEvent]CreateSubscriber")
        this.subscriber = subscriber
        this.result = "Create subscriber succeed"
    }
})
```

Z
zengsiyu 已提交
59
4. 创建订阅回调函数,订阅回调函数会在接收到事件时触发。订阅回调函数返回的data内包含了公共事件的名称、发布者携带的数据等信息,公共事件数据的详细参数和数据类型请见[CommonEventData文档](../reference/apis/js-apis-commonEvent.md#commoneventdata)介绍。
Z
zengsiyu 已提交
60

战场小包's avatar
战场小包 已提交
61
```js
Z
zengsiyu 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//订阅公共事件回调
if (this.subscriber != null) {
    commonEvent.subscribe(this.subscriber, (err, data) => {
        if (err.code) {
            console.error("[CommonEvent]SubscribeCallBack err=" + JSON.stringify(err))
        } else {
            console.log("[CommonEvent]SubscribeCallBack data=" + JSON.stringify(data))
            this.result = "receive, event = " + data.event + ", data = " + data.data + ", code = " + data.code
        }
    })
    this.result = "Subscribe succeed"
} else {
    prompt.showToast({ message: "Need create subscriber" })
}
```

## 公共事件发布开发指导

### 场景介绍
当需要发布某个自定义公共事件时,可以通过此方法发布事件。发布的公共事件可以携带数据,供订阅者解析并进行下一步处理。

### 接口说明
| 接口名                              | 接口描述 |
| ---------------------------------- | ------ |
F
fangJinliang1 已提交
86 87
| publish(event: string, callback: AsyncCallback) | 发布公共事件 |
| publish(event: string, options: CommonEventPublishData, callback: AsyncCallback) | 指定发布信息并发布公共事件 |
Z
zengsiyu 已提交
88 89 90 91 92

### 开发步骤
#### 发布公共事件开发步骤
1. 导入CommonEvent模块。

战场小包's avatar
战场小包 已提交
93
```js
Z
zengsiyu 已提交
94 95 96 97 98
import commonEvent from '@ohos.commonEvent';
```

2. 传入需要发布的事件名称和回调函数,发布事件。

战场小包's avatar
战场小包 已提交
99
```js
Z
zengsiyu 已提交
100 101
//发布公共事件
commonEvent.publish("event", (err) => {
102 103 104 105 106
    if (err.code) {
        console.error("[CommonEvent]PublishCallBack err=" + JSON.stringify(err))
    } else {
        console.info("[CommonEvent]Publish1")
    }
Z
zengsiyu 已提交
107 108 109 110 111 112
})
```

#### 指定发布信息发布公共事件的开发步骤
1. 导入CommonEvent模块。

战场小包's avatar
战场小包 已提交
113
```js
Z
zengsiyu 已提交
114 115 116
import commonEvent from '@ohos.commonEvent'
```

Z
zengsiyu 已提交
117
2. 定义发布事件时需要指定的发布信息,发布信息所包含的详细参数及其参数类型请见[CommonEventPublishData文档](../reference/apis/js-apis-commonEvent.md#commoneventpublishdata)介绍。
Z
zengsiyu 已提交
118

战场小包's avatar
战场小包 已提交
119
```js
Z
zengsiyu 已提交
120 121
//公共事件相关信息
var options = {
122 123
    code: 1,			 //公共事件的初始代码
    data: "initial data",//公共事件的初始数据
Z
zengsiyu 已提交
124 125 126 127 128
}
```

3. 传入需要发布的事件名称、需要发布的指定信息和回调函数,发布事件。

战场小包's avatar
战场小包 已提交
129
```js
Z
zengsiyu 已提交
130 131
//发布公共事件
commonEvent.publish("event", options, (err) => {
132 133 134 135 136
    if (err.code) {
        console.error("[CommonEvent]PublishCallBack err=" + JSON.stringify(err))
    } else {
        console.info("[CommonEvent]Publish2")
    }
Z
zengsiyu 已提交
137 138 139 140 141 142 143 144 145 146 147
})
```

## 公共事件取消订阅开发指导

### 场景介绍
订阅者需要取消已订阅的某个公共事件时,可以通过此方法取消订阅事件。

### 接口说明
| 接口名                              | 接口描述 |
| ---------------------------------- | ------ |
F
fangJinliang1 已提交
148
| unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback) | 取消订阅公共事件 |
Z
zengsiyu 已提交
149 150 151 152

### 开发步骤
1. 导入CommonEvent模块。

战场小包's avatar
战场小包 已提交
153
```js
Z
zengsiyu 已提交
154 155 156 157 158 159
import commonEvent from '@ohos.commonEvent';
```

2. 根据[公共事件订阅指导](#公共事件订阅开发指导)的步骤来订阅某个事件。
3. 调用CommonEvent中的unsubscribe方法取消订阅某事件。

战场小包's avatar
战场小包 已提交
160
```js
Z
zengsiyu 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173
if (this.subscriber != null) {
    commonEvent.unsubscribe(this.subscriber, (err) => {
        if (err.code) {
            console.error("[CommonEvent]UnsubscribeCallBack err=" + JSON.stringify(err))
        } else {
            console.log("[CommonEvent]Unsubscribe")
            this.subscriber = null
            this.result = "Unsubscribe succeed"
        }
    })
}
```

Z
zengyawen 已提交
174
## 相关实例
Z
zengsiyu 已提交
175

Z
zengyawen 已提交
176
针对公共事件开发,有以下相关实例可供参考:
Z
zengsiyu 已提交
177

178
- [`CommonEvent`:订阅公共事件(ArkTS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/Notification/CommonEvent)
Z
zengsiyu 已提交
179 180