notification.md 8.9 KB
Newer Older
Z
zengyawen 已提交
1 2


3
# Notification开发指导
Z
zengyawen 已提交
4

5
## 场景简介
Z
zengyawen 已提交
6 7 8 9 10 11 12 13 14 15 16

OpenHarmony通过ANS(Advanced Notification Service,通知系统服务)对通知类型的消息进行管理,支持多种通知类型,包括文本,长文本,多文本,图片,社交,媒体等。所有系统服务以及应用都可以通过通知接口发送通知消息,用户可以通过SystemUI查看所有通知消息。

通知常见的使用场景:

- 显示接收到短消息、即时消息等。
- 显示应用的推送消息,如广告、版本更新等。
- 显示当前正在进行的事件,如导航、下载等。



17
## 通知流程
Z
zengyawen 已提交
18

19
通知业务流程由ANS通知子系统、通知发送端、通知订阅端组成。
Z
zengyawen 已提交
20

21
一条通知从通知发送端产生,通过IPC通信发送到ANS,ANS再分发给通知订阅端。
Z
zengyawen 已提交
22

23
系统应用还支持通知相关配置,如使能开关、配置参数由系统配置发起请求,发送到ANS存储到内存和数据库。
Z
zengyawen 已提交
24

F
fangjinliang 已提交
25
![1648113187545](figures/notification.png)
Z
zengyawen 已提交
26 27 28



29
## 接口说明
Z
zengyawen 已提交
30

31
部分接口仅系统应用才可以调用,且需要具备权限:SystemCapability.Notification.Notification ,接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同,具体API说明详见[接口文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-notification.md)
Z
zengyawen 已提交
32

33
**表1** 通知使能开关接口功能介绍 
Z
zengyawen 已提交
34

35 36 37 38
| 接口名                                                       | 描述             |
| ------------------------------------------------------------ | ---------------- |
| isNotificationEnabled(bundle: BundleOption, callback: AsyncCallback<boolean>): void | 查询通知使能开关 |
| enableNotification(bundle: BundleOption, enable: boolean, callback: AsyncCallback<void>): void | 设置使能开关     |
Z
zengyawen 已提交
39

40
用于查询和设置通知使能开关,若某个应用的通知使能关闭状态,则无法发送通知。
Z
zengyawen 已提交
41 42 43



44
**表2** 通知订阅接口功能介绍
Z
zengyawen 已提交
45

46 47 48 49 50
| 接口名                                                       | 描述             |
| ------------------------------------------------------------ | ---------------- |
| subscribe(subscriber: NotificationSubscriber, info: NotificationSubscribeInfo, callback: AsyncCallback<void>): void | 订阅指定应用通知 |
| subscribe(subscriber: NotificationSubscriber, callback: AsyncCallback<void>): void | 订阅所有通知     |
| unsubscribe(subscriber: NotificationSubscriber, callback: AsyncCallback<void>): void | 取消订阅通知     |
Z
zengyawen 已提交
51

52
订阅接口有支持订阅所有通知、或订阅某些应用的通知。
Z
zengyawen 已提交
53 54 55



56
**表3** 通知订阅回调接口功能介绍
Z
zengyawen 已提交
57

58 59 60 61 62 63 64
| 接口名                                           | 描述             |
| ------------------------------------------------ | ---------------- |
| onConsume?:(data: SubscribeCallbackData) => void | 通知回调         |
| onCancel?:(data: SubscribeCallbackData) => void  | 通知取消回调     |
| onUpdate?:(data: NotificationSortingMap) => void | 通知排序更新回调 |
| onConnect?:() => void;                           | 订阅成功回调     |
| onDisconnect?:() => void;                        | 取消订阅回调     |
Z
zengyawen 已提交
65 66 67



68
**表4** 发送通知接口功能介绍
Z
zengyawen 已提交
69

70 71 72 73 74 75
| 接口名                                                       | 描述                     |
| ------------------------------------------------------------ | ------------------------ |
| publish(request: NotificationRequest, callback: AsyncCallback<void>): void | 发布通知                 |
| publish(request: NotificationRequest, userId: number, callback: AsyncCallback<void>): void | 指定用户发布通知         |
| cancel(id: number, label: string, callback: AsyncCallback<void>): void | 取消指定的通知           |
| cancelAll(callback: AsyncCallback<void>): void;              | 取消所有该应用发布的通知 |
Z
zengyawen 已提交
76

77
携带userId的publish接口,可以指定向该用户下订阅者发布通知。
Z
zengyawen 已提交
78 79 80



81
## 开发指导
Z
zengyawen 已提交
82

83
通知的开发步骤一般是订阅通知、开启通知使能、发布通知。
Z
zengyawen 已提交
84

85
### 导入模块
Z
zengyawen 已提交
86

87 88 89
```js
import Notification from '@ohos.notification';
```
Z
zengyawen 已提交
90 91 92



93
### 通知订阅
Z
zengyawen 已提交
94

95
通知接受端首选需要向通知子系统发起通知订阅。
Z
zengyawen 已提交
96

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
```js
var subscriber = {
    onConsume: function (data) {
      let req = data.request;
      console.info('===>onConsume callback req.id: ' + req.id);
    },
    onCancel: function (data) {
      let req = data.request;
      console.info('===>onCancel callback req.id: : ' + req.id);
    },
    onUpdate: function (data) {
      console.info('===>onUpdate in test===>');
    },
    onConnect: function () {
      console.info('===>onConnect in test===>');
    },
    onDisconnect: function () {
      console.info('===>onDisConnect in test===>');
    },
    onDestroy: function () {
      console.info('===>onDestroy in test===>');
    },
  };

  Notification.subscribe(subscriber, (err, data) => { // callback形式调用异步接口
    if (err.code) {
      console.error('===>failed to subscribe because ' + JSON.stringify(err));
      return;
    }
    console.info('===>subscribeTest success : ' + JSON.stringify(data));
Z
zengyawen 已提交
127
  });
128
```
Z
zengyawen 已提交
129 130 131



132
### 通知发送
Z
zengyawen 已提交
133

134
通知发布前,先查询应用通知使能开关是否打开,新安装的应用使能默认是关闭状态。
Z
zengyawen 已提交
135

136
##### 开启通知使能
Z
zengyawen 已提交
137

138
先查询通知使能
Z
zengyawen 已提交
139

140 141 142 143 144 145 146 147
```js
var bundle = {
    bundle: "bundleName1",
}
Notification.isNotificationEnabled(bundle).then((data) => {
	console.info("===>isNotificationEnabled success===>");
});
```
Z
zengyawen 已提交
148

149
若使能为false关闭状态,需要开启使能
Z
zengyawen 已提交
150

151 152 153 154 155 156 157 158
```js
var bundle = {
    bundle: "bundleName1",
}
Notification.enableNotification(bundle, true, async(err) => {
    console.log("===>enableNotification success===>");
});
```
Z
zengyawen 已提交
159 160 161



162
##### 通知发布
Z
zengyawen 已提交
163

164
发布通知,先要构造NotificationRequest对象,设置通知类型、标题、内容等一系列属性。下面以发布普通文本和携带wantAgent通知为例。
Z
zengyawen 已提交
165

166
普通文本通知实例
Z
zengyawen 已提交
167

168 169 170 171
```js
//构造NotificationRequest对象
var notificationRequest = {
  	id: 1,
Z
zengyawen 已提交
172 173 174 175 176 177 178 179
  	content: {
  		contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
  		normal: {
  			title: "test_title",
  			text: "test_text",
  			additionalText: "test_additionalText"
  		}
  	}
180 181 182 183 184 185 186 187 188
}

//通知发送
Notification.publish(notificationRequest) .then((data) => {
	console.info('===>publish promise success req.id : ' + notificationRequest.id);
}).catch((err) => {
	console.error('===>publish promise failed because ' + JSON.stringify(err));
});
```
Z
zengyawen 已提交
189 190 191



192
携带wantAgent通知实例
Z
zengyawen 已提交
193

194
wantAgent使用详见[wantAgent开发文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/wantagent.md)
Z
zengyawen 已提交
195

196
- 创建wantAgent对象
Z
zengyawen 已提交
197

198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
```js
import wantAgent from '@ohos.wantAgent';
import { OperationType, Flags } from '@ohos.wantagent';

//WantAgentInfo对象
var wantAgentInfo = {
    wants: [
        {
            deviceId: 'deviceId',
            bundleName: 'com.example.myapplication',
            abilityName: 'com.example.myapplication.MainAbility',
            action: 'REMINDER_EVENT_REMOVE_NOTIFICATION',
            entities: ['entity1'],
            type: 'MIMETYPE',
            uri: 'key={true,true,false}',
            parameters: { myKey0: 1111 },
        }
    ],
    operationType: OperationType.START_ABILITIES,
    requestCode: 0,
    wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG]
}

//wantAgent对象
var WantAgent;

//getWantAgent回调
function getWantAgentCallback(err, data) {
    console.info("===>getWantAgentCallback===>");
    if (err.code == 0) {
    	WantAgent = data;
    } else {
        console.info('----getWantAgent failed!----');
    }
}

// 获取wantAgent对象
wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback)
```
Z
zengyawen 已提交
237

238
- 发布通知
Z
zengyawen 已提交
239 240

```js
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
//构造NotificationRequest对象
var notificationRequest = {
  content: {
    contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {
      title: "AceApplication_Title",
      text: "AceApplication_Text",
      additionalText: "AceApplication_AdditionalText"
    },
  },
  id: 1,
  label: 'TEST',
  wantAgent: WantAgent,
  slotType: notify.SlotType.OTHER_TYPES,
  deliveryTime: new Date().getTime()
}

//通知发送
Notification.publish(notificationRequest) .then((data) => {
	console.info('===>publish promise success req.id : ' + notificationRequest.id);
}).catch((err) => {
	console.error('===>publish promise failed because ' + JSON.stringify(err));
});
Z
zengyawen 已提交
264 265 266 267
```



268
- 取消通知
Z
zengyawen 已提交
269

270
取消通知可以分成取消指定的单条通知和取消所有通知,应用只能取消自己发布的通知。
Z
zengyawen 已提交
271

272 273 274 275 276
```js
//cancel回调
function cancelCallback(err) {
	console.info("===>cancelCallback===>");
}
Z
zengyawen 已提交
277

278 279
Notification.cancel(1, "label", cancelCallback)
```
Z
zengyawen 已提交
280 281 282



283
## 开发实例
Z
zengyawen 已提交
284

285
针对通知开发,有以下示例工程可供参考:
Z
zengyawen 已提交
286

287
- notification
Z
zengyawen 已提交
288

289
本示例展示了在eTS中如何使用Notification的接口完成通知订阅、取消订阅、发布通知、取消通知、查询和开启通知使能功能。
Z
zengyawen 已提交
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317