From ace83d60c925f94f00264faeacb211b09ae273ad Mon Sep 17 00:00:00 2001 From: fangjinliang Date: Thu, 24 Mar 2022 19:59:28 +0800 Subject: [PATCH] notification development documentation Signed-off-by: fangjinliang --- .../notification/figures/notification.png | Bin 0 -> 42219 bytes .../notification/notification.md | 1665 ++--------------- 2 files changed, 192 insertions(+), 1473 deletions(-) create mode 100644 zh-cn/application-dev/notification/figures/notification.png diff --git a/zh-cn/application-dev/notification/figures/notification.png b/zh-cn/application-dev/notification/figures/notification.png new file mode 100644 index 0000000000000000000000000000000000000000..230932dc02909245c26b764f1dc94a083185378d GIT binary patch literal 42219 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 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/notification/notification.md b/zh-cn/application-dev/notification/notification.md index 13deeff443..764da2b0f1 100644 --- a/zh-cn/application-dev/notification/notification.md +++ b/zh-cn/application-dev/notification/notification.md @@ -2,7 +2,7 @@ # Notification开发指导 -#### 简介 +## 场景简介 OpenHarmony通过ANS(Advanced Notification Service,通知系统服务)对通知类型的消息进行管理,支持多种通知类型,包括文本,长文本,多文本,图片,社交,媒体等。所有系统服务以及应用都可以通过通知接口发送通知消息,用户可以通过SystemUI查看所有通知消息。 @@ -14,521 +14,161 @@ OpenHarmony通过ANS(Advanced Notification Service,通知系统服务)对 -#### 接口列表 - -| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | -| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -| Notification.publish(request: NotificationRequest, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.publish(request: NotificationRequest) | 支持 | 支持 | 支持 | 支持 | -| Notification.cancel(id: number, label: string, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.cancel(id:number, label?:string) | 支持 | 支持 | 支持 | 支持 | -| Notification.cancel(id: number, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.cancelAll(callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.cancelAll() | 支持 | 支持 | 支持 | 支持 | -| Notification.addSlot(type: SlotType, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.addSlot(type: SlotType) | 支持 | 支持 | 支持 | 支持 | -| Notification.getSlot(slotType: SlotType, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.getSlot(slotType: SlotType) | 支持 | 支持 | 支持 | 支持 | -| Notification.getSlots(callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | -| Notification.getSlots() | 支持 | 支持 | 支持 | 支持 | -| Notification.removeSlot(slotType: SlotType, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.removeSlot(slotType: SlotType) | 支持 | 支持 | 支持 | 支持 | -| Notification.removeAllSlots(callback: AsyncCallback): void | 支持 | 支持 | 支持 | 支持 | -| Notification.removeAllSlots(): Promise | 支持 | 支持 | 支持 | 支持 | -| Notification.getActiveNotificationCount(callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| Notification.getActiveNotificationCount() | 支持 | 支持 | 支持 | 支持 | -| Notification.getActiveNotifications(callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | -| Notification.getActiveNotifications() | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getWantAgent(info: WantAgentInfo, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getWantAgent(info: WantAgentInfo): Promise | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getBundleName(agent: WantAgent, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getBundleName(agent: WantAgent): Promise | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getUid(agent: WantAgent, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.getUid(agent: WantAgent): Promise | 支持 | 支持 | 支持 | 支持 | -| WantAgent.cancel(agent: WantAgent, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.cancel(agent: WantAgent): Promise | 支持 | 支持 | 支持 | 支持 | -| WantAgent.trigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: Callback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.equal(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | -| WantAgent.equal(agent: WantAgent, otherAgent: WantAgent): Promise | 支持 | 支持 | 支持 | 支持 | - - - -#### Notification接口 - -##### 导入模块 +## 通知流程 -```js -import Notification from '@ohos.notification'; -``` - - - -##### NotificationSlot类型说明 - -NotificationSlot可以对提示音、振动等进行设置。一个应用可以创建一个或多个NotificationSlot,在发布通知时,通过绑定不同的NotificationSlot,实现不同用途。 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| -------------------- | -------- | ------------- | ---- | ---------------------------- | -| type | 读、写 | SlotType | 是 | 通道类型 | -| level | 读、写 | SlotLevel | 否 | 通知级别 | -| desc | 读、写 | string | 否 | 通知渠道描述信息 | -| badgeFlag | 读、写 | boolean | 否 | 是否显示角标 | -| bypassDnd | 读、写 | boolean | 否 | 置是否在系统中绕过免打扰模式 | -| lockscreenVisibility | 读、写 | boolean | 否 | 在锁定屏幕上显示通知的模式 | -| vibrationEnabled | 读、写 | boolean | 否 | 是否可振动 | -| sound | 读、写 | string | 否 | 通知提示音 | -| lightEnabled | 读、写 | boolean | 否 | 是否闪灯 | -| lightColor | 读、写 | number | 否 | 通知灯颜色 | -| vibrationValues | 读、写 | Array | 否 | 通知振动样式 | - -- SlotType类型说明 - -| 名称 | 读写属性 | 类型 | 描述 | -| -------------------- | -------- | ---- | -------- | -| SOCIAL_COMMUNICATION | 只读 | enum | 社交类型 | -| SERVICE_INFORMATION | 只读 | enum | 服务类型 | -| CONTENT_INFORMATION | 只读 | enum | 内容类型 | -| OTHER_TYPES | 只读 | enum | 其他类型 | - -- SlotLevel类型说明 - -| 名称 | 读写属性 | 类型 | 描述 | -| ------------- | -------- | ---- | ------------------------------------------------------------ | -| LEVEL_NONE | 只读 | enum | 表示通知不发布 | -| LEVEL_MIN | 只读 | enum | 表示通知可以发布,但不在状态栏显示,不自动弹出,无提示音;该级别不适用于前台服务的场景 | -| LEVEL_LOW | 只读 | enum | 表示通知发布后在状态栏显示,不自动弹出,无提示音 | -| LEVEL_DEFAULT | 只读 | enum | 表示通知发布后在状态栏显示,不自动弹出,触发提示音 | -| LEVEL_HIGH | 只读 | enum | 表示通知发布后在状态栏显示,自动弹出,触发提示音 | - - - -##### NotificationRequest类型说明 - -NotificationRequest用于设置具体的通知对象,包括设置通知的属性,如:通知的分发时间、小图标、大图标、自动删除等参数,以及设置具体的通知类型,如普通文本、长文本等。 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ----------------- | -------- | ------------------------------- | ---- | -------------------------- | -| content | 读、写 | NotificationContent | 是 | 通知内容 | -| id | 读、写 | number | 否 | 通知ID | -| slotType | 读、写 | SlotType | 否 | 通道类型 | -| isOngoing | 读、写 | boolean | 否 | 是否进行时通知 | -| isUnremovable | 读、写 | boolean | 否 | 是否可移除 | -| deliveryTime | 读、写 | number | 否 | 通知发送时间 | -| tapDismissed | 读、写 | boolean | 否 | 通知是否自动清除 | -| autoDeletedTime | 读、写 | number | 否 | 自动清除的时间 | -| wantAgent | 读、写 | WantAgent | 否 | 点击跳转的WantAgent | -| extraInfo | 读、写 | {[key: string]: any} | 否 | 扩展参数 | -| color | 读、写 | number | 否 | 通知背景颜色 | -| colorEnabled | 读、写 | boolean | 否 | 通知背景颜色是否使能 | -| isAlertOnce | 读、写 | boolean | 否 | 设置是否仅有一次此通知警报 | -| isStopwatch | 读、写 | boolean | 否 | 是否显示已用时间 | -| isCountDown | 读、写 | boolean | 否 | 是否显示倒计时时间 | -| isFloatingIcon | 读、写 | boolean | 否 | 是否显示状态栏图标 | -| isFloatingIcon | 读、写 | boolean | 否 | 是否显示状态栏图标 | -| label | 读、写 | string | 否 | 通知标签 | -| badgeIconStyle | 读、写 | number | 否 | 通知角标类型 | -| showDeliveryTime | 读、写 | boolean | 否 | 是否显示分发时间 | -| actionButtons | 读、写 | Array | 否 | 通知按钮,最多两个按钮 | -| smallIcon | 读、写 | PixelMap | 否 | 通知小图标 | -| largeIcon | 读、写 | PixelMap | 否 | 通知大图标 | -| creatorBundleName | 只读 | string | 否 | 创建通知的包名 | -| creatorUid | 只读 | number | 否 | 创建通知的UID | -| creatorPid | 只读 | number | 否 | 创建通知的PID | -| hashCode | 只读 | string | 否 | 通知唯一标识 | - -- NotificationContent类型说明 - - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ----------- | -------- | ---------------------------- | ---- | -------------------- | -| contentType | 读、写 | ContentType | 是 | 通知内容类型 | -| normal | 读、写 | NotificationBasicContent | 否 | 普通类型通知内容 | -| longText | 读、写 | NotificationLongTextContent | 否 | 长文本类型通知内容 | -| multiLine | 读、写 | NotificationMultiLineContent | 否 | 多行文本类型通知内容 | -| picture | 读、写 | NotificationPictureContent | 否 | 图片类型通知内容 | - -- ContentType类型说明 - -| 名称 | 读写属性 | 类型 | 描述 | -| --------------------------------- | -------- | ---- | ---------------- | -| NOTIFICATION_CONTENT_BASIC_TEXT | 只读 | enum | 普通类型通知 | -| NOTIFICATION_CONTENT_LONG_TEXT | 只读 | enum | 长文本类型通知 | -| NOTIFICATION_CONTENT_PICTURE | 只读 | enum | 图片类型通知 | -| NOTIFICATION_CONTENT_CONVERSATION | 只读 | enum | 社交类型通知 | -| NOTIFICATION_CONTENT_MULTILINE | 只读 | enum | 多行文本类型通知 | - -- NotificationBasicContent类型说明 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| -------------- | -------- | ------ | ---- | -------------------------------- | -| title | 读、写 | string | 是 | 通知标题 | -| text | 读、写 | string | 是 | 通知内容 | -| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | - -- NotificationLongTextContent类型说明 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ------------- | -------- | ------ | ---- | ---------------------- | -| title | 读、写 | string | 是 | 通知标题 | -| text | 读、写 | string | 是 | 通知内容 | -| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | -| longText | 读、写 | string | 是 | 通知的长文本 | -| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | -| expandedTitle | 读、写 | string | 是 | 通知展开时的标题 | - -- NotificationMultiLineContent类型说明 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| --------- | -------- | ------------- | ---- | ---------------------- | -| title | 读、写 | string | 是 | 通知标题 | -| text | 读、写 | string | 是 | 通知内容 | -| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | -| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | -| longTitle | 读、写 | string | 是 | 通知展开时的标题 | -| lines | 读、写 | Array | 是 | 通知的多行文本 | - -- NotificationPictureContent类型说明 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| -------------- | -------- | -------------- | ---- | -------------------------------- | -| title | 读、写 | string | 是 | 通知标题 | -| text | 读、写 | string | 是 | 通知内容 | -| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | -| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | -| expandedTitle | 读、写 | string | 是 | 通知展开时的标题 | -| picture | 读、写 | image.PixelMap | 是 | 通知的图片内容 | - -- NotificationActionButton类型说明 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| --------- | -------- | -------------- | ---- | ------------------------- | -| title | 读、写 | string | 是 | 按钮标题 | -| wantAgent | 读、写 | wantAgent | 是 | 点击按钮时触发的WantAgent | -| extras | 读、写 | Array | 否 | 按钮扩展信息 | -| icon | 读、写 | image.PixelMap | 否 | 按钮图标 | - - - -##### 创建通知通道 - -- 创建通知通道(callback形式) - - Notification.addSlot(type: SlotType, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | ---------------------- | - | type | 只读 | SlotType | 是 | 要创建的通知通道的类型 | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //addslot回调 - function addSlotCallBack(err) { - console.info("==========================>addSlotCallBack=======================>"); - } - Notification.addSlot(SOCIAL_COMMUNICATION, addSlotCallBack) - ``` - - - -- 创建通知通道(Promise形式) - - Notification.addSlot(type: SlotType) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ---- | -------- | -------- | ---- | ---------------------- | - | type | 只读 | SlotType | 是 | 要创建的通知通道的类型 | - - - 返回值 - - Promise<**void**> - - - 示例代码 - - ```js - Notification.addSlot(SOCIAL_COMMUNICATION).then((void) => { - console.info("==========================>addSlotCallback=======================>"); - }); - ``` - - - -##### 获取通知通道 - -- 获取一个通知通道(callback形式) - - Notification.getSlot(slotType: SlotType, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------------------- | ---- | ----------------------------------------------------------- | - | slotType | 只读 | slotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //getSlot回调 - function getSlotCallback(err,data) { - console.info("==========================>getSlotCallback=======================>"); - } - var slotType = SOCIAL_COMMUNICATION; - Notification.getSlot(slotType, getSlotCallback) - ``` - - - -- 获取一个通知通道(Promise形式) - - Notification.getSlot(slotType) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | -------- | ---- | ----------------------------------------------------------- | - | slotType | 只读 | slotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | - - - 返回值 - - Promise +通知业务流程由ANS通知子系统、通知发送端、通知订阅端组成。 - - 示例代码 +一条通知从通知发送端产生,通过IPC通信发送到ANS,ANS再分发给通知订阅端。 - ```js - var slotType = SOCIAL_COMMUNICATION; - Notification.getSlot(slotType).then((data) => { - console.info("==========================>getSlotCallback=======================>"); - }); - ``` - - - -- 获取本应用程序的所有通知通道(callback形式) - - Notification.getSlots(callback: AsyncCallback>) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------------------- | ---- | -------------------- | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //getSlots回调 - function getSlotsCallback(err,data) { - console.info("==========================>getSlotsCallback=======================>"); - } - Notification.getSlots(getSlotsCallback) - ``` - - - -- 获取此应用程序的所有通知通道(Promise形式) - - Notification.getSlots() - - - 参数描述 - - 无参数 - - - 返回值 - - Promise> - - - 示例代码 - - ```js - Notification.getSlots().then((data) => { - console.info("==========================>getSlotsCallback=======================>"); - }); - ``` - - - -##### 删除通知通道 - -- 根据通知通道类型删除通知通道(callback形式) - - Notification.removeSlot(slotType: SlotType, callback: AsyncCallback) +系统应用还支持通知相关配置,如使能开关、配置参数由系统配置发起请求,发送到ANS存储到内存和数据库。 - - 参数描述 +![1648113187545](.\figures\notification.png) - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | ----------------------------------------------------------- | - | SlotType | 只读 | SlotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - 返回值 - void +## 接口说明 - - 示例代码 +部分接口仅系统应用才可以调用,且需要具备权限: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)。 - ```js - //removeSlot回调 - function removeSlotCallback(err) { - console.info("==========================>removeSlotCallback=======================>"); - } - var slotType = SOCIAL_COMMUNICATION; - Notification.removeSlot(slotType, removeSlotCallback) - ``` +**表1** 通知使能开关接口功能介绍 +| 接口名 | 描述 | +| ------------------------------------------------------------ | ---------------- | +| isNotificationEnabled(bundle: BundleOption, callback: AsyncCallback): void | 查询通知使能开关 | +| enableNotification(bundle: BundleOption, enable: boolean, callback: AsyncCallback): void | 设置使能开关 | +用于查询和设置通知使能开关,若某个应用的通知使能关闭状态,则无法发送通知。 -- 根据通知通道类型删除通知通道(Promise形式) - Notification.removeSlot(slotType: SlotType) - - 参数描述 +**表2** 通知订阅接口功能介绍 - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | -------- | ---- | ----------------------------------------------------------- | - | SlotType | 只读 | SlotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | +| 接口名 | 描述 | +| ------------------------------------------------------------ | ---------------- | +| subscribe(subscriber: NotificationSubscriber, info: NotificationSubscribeInfo, callback: AsyncCallback): void | 订阅指定应用通知 | +| subscribe(subscriber: NotificationSubscriber, callback: AsyncCallback): void | 订阅所有通知 | +| unsubscribe(subscriber: NotificationSubscriber, callback: AsyncCallback): void | 取消订阅通知 | - - 返回值 +订阅接口有支持订阅所有通知、或订阅某些应用的通知。 - Promise<**void**> - - 示例代码 - ```js - var slotType = SOCIAL_COMMUNICATION; - Notification.removeSlot(slotType).then((void) => { - console.info("==========================>removeSlotCallback=======================>"); - }); - ``` - - - -- 删除所有通知通道(callback形式) +**表3** 通知订阅回调接口功能介绍 - Notification.removeAllSlots(callback: AsyncCallback) +| 接口名 | 描述 | +| ------------------------------------------------ | ---------------- | +| onConsume?:(data: SubscribeCallbackData) => void | 通知回调 | +| onCancel?:(data: SubscribeCallbackData) => void | 通知取消回调 | +| onUpdate?:(data: NotificationSortingMap) => void | 通知排序更新回调 | +| onConnect?:() => void; | 订阅成功回调 | +| onDisconnect?:() => void; | 取消订阅回调 | - - 参数描述 - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | -------------------- | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - 返回值 +**表4** 发送通知接口功能介绍 - void +| 接口名 | 描述 | +| ------------------------------------------------------------ | ------------------------ | +| publish(request: NotificationRequest, callback: AsyncCallback): void | 发布通知 | +| publish(request: NotificationRequest, userId: number, callback: AsyncCallback): void | 指定用户发布通知 | +| cancel(id: number, label: string, callback: AsyncCallback): void | 取消指定的通知 | +| cancelAll(callback: AsyncCallback): void; | 取消所有该应用发布的通知 | - - 示例代码 +携带userId的publish接口,可以指定向该用户下订阅者发布通知。 - ```js - function removeAllSlotsCallBack(err) { - console.info("================>removeAllSlotsCallBack=======================>"); - } - Notification.removeAllSlots(removeAllCallBack) - ``` +## 开发指导 -- 删除所有通知通道(Promise形式) +通知的开发步骤一般是订阅通知、开启通知使能、发布通知。 - Notification.removeAllSlots() +### 导入模块 - - 参数描述 +```js +import Notification from '@ohos.notification'; +``` - 无参数 - - 返回值 - Promise<**void**> +### 通知订阅 - - 示例代码 +通知接受端首选需要向通知子系统发起通知订阅。 - ```js - Notification.removeAllSlots().then((void) => { - console.info("==========================>removeAllSlotsCallBack=======================>"); +```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)); }); - ``` - - - -##### 发布通知 - -- 发布通知(callback形式) - - Notification.publish(request: NotificationRequest, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | ------------------------------------------- | - | request | 只读 | NotificationRequest | 是 | 设置要发布通知内容的NotificationRequest对象 | - | callback | 只读 | AsyncCallback | 是 | 被指定的回调方法 | +``` - - 返回值 - void - - 示例代码 +### 通知发送 - ```js - //publish回调 - function publishCallback(err) { - console.info("==========================>publishCallback=======================>"); - } - //通知Request对象 - var request = { - id: 1, - content: { - contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, - normal: { - title: "test_title", - text: "test_text", - additionalText: "test_additionalText" - } - } - } - Notification.publish(request, publishCallback); - ``` +通知发布前,先查询应用通知使能开关是否打开,新安装的应用使能默认是关闭状态。 +##### 开启通知使能 +先查询通知使能 +```js +var bundle = { + bundle: "bundleName1", +} +Notification.isNotificationEnabled(bundle).then((data) => { + console.info("===>isNotificationEnabled success===>"); +}); +``` -- 发布通知(Promise形式) +若使能为false关闭状态,需要开启使能 - Notification.publish(request: NotificationRequest) +```js +var bundle = { + bundle: "bundleName1", +} +Notification.enableNotification(bundle, true, async(err) => { + console.log("===>enableNotification success===>"); +}); +``` - - 参数描述 - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ------- | -------- | ------------------- | ---- | ------------------------------------------- | - | request | 只读 | NotificationRequest | 是 | 设置要发布通知内容的NotificationRequest对象 | - - 返回值 +##### 通知发布 - Promise<**void**> +发布通知,先要构造NotificationRequest对象,设置通知类型、标题、内容等一系列属性。下面以发布普通文本和携带wantAgent通知为例。 - - 示例代码 +普通文本通知实例 - ```js - //通知Request对象 - var notificationRequest = { - notificationId: 1, +```js +//构造NotificationRequest对象 +var notificationRequest = { + id: 1, content: { contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { @@ -537,1039 +177,118 @@ NotificationRequest用于设置具体的通知对象,包括设置通知的属 additionalText: "test_additionalText" } } - } - Notification.publish(notificationRequest).then((void) => { - ``` - - console.info("==========================>publishCallback=======================>"); - }); - - ``` - - ``` - - - -##### 取消通知 - -- 取消指定通知(callback形式) - - Notification.cancel(id: number, label: string, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | -------------------- | - | id | 只读 | number | 是 | 通知ID | - | lable | 只读 | string | 是 | 通知标签 | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //cancel回调 - function cancelCallback(err) { - console.info("==========================>cancelCallback=======================>"); - } - Notification.cancel(0, "label", cancelCallback) - ``` - - - -- 取消指定通知(Promise形式) - - Notification.cancel(id:number, label?:string) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ----- | -------- | ------ | ---- | -------- | - | id | 只读 | number | 是 | 通知ID | - | lable | 只读 | string | 是 | 通知标签 | - - - 返回值 - - Promise<**void**> - - - 示例代码 - - ```js - Notification.cancel(0).then((void) => { - console.info("==========================>cancelCallback=======================>"); - }); - ``` - - - -- 取消指定id通知(callback形式) - - Notification.cancel(id: number, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | -------------------- | - | id | 只读 | number | 是 | 通知ID | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //cancel回调 - function cancelCallback(err) { - console.info("==========================>cancelCallback=======================>"); - } - Notification.cancel(0, cancelCallback) - ``` - - - -- 取消所有已发布的通知(callback形式) - - Notification.cancelAll(callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | -------------------- | - | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | - - - 返回值 - - void - - - 示例代码 - - ```js - //cancel回调 - function cancelAllback(err) { - console.info("==========================>cancelAllback=======================>"); - } - Notification.cancelAll(cancelCallback) - ``` - - - -- 取消所有已发布的通知(Promise形式) - - Notification.cancelAll() - - - 参数描述 - - 无参数 - - - 返回值 - - Promise - - - 示例代码 - - ```js - Notification.cancelAll().then((void) => { - ``` - - console.info("==========================>cancelAllback=======================>"); - }); - - ``` - - ``` - - - -##### 获取当前应用活动通知 - -- 获取当前应用的活动通知数(Callback形式) - - Notification.getActiveNotificationCount(callback: AsyncCallback<**number**>) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------------- | ---- | ---------------------- | - | callback | 只读 | AsyncCallback<**number**> | 是 | 获取活动通知数回调函数 | - - - 返回值 - - void - - - 示例代码 - - ```js - function getActiveNotificationCountCallback(err, data) { - console.info("==========================>getActiveNotificationCountCallback=======================>"); - } - Notification.getActiveNotificationCount(getActiveNotificationCountCallback); - ``` - - - -- 获取当前应用的活动通知数(Promise形式) - - Notification.getActiveNotificationCount() - - - 参数描述 - - 无 - - - 返回值 - - Promise<**number**> - - - 示例代码 - - ```js - Notification.getActiveNotificationCount().then((data) => { - console.info("==========================>getActiveNotificationCountCallback=======================>"); - }); - ``` - - - -- 获取当前应用的活动通知(Callback形式) - - Notification.getActiveNotifications(callback: AsyncCallback>) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ----------------------------------------- | ---- | ------------------------------ | - | callback | 只读 | AsyncCallback> | 是 | 获取当前应用的活动通知回调函数 | - - - 返回值 - - void - - - 示例代码 - - ```js - function getActiveNotificationsCallback(err, data) { - console.info("==========================>getActiveNotificationsCallback=======================>"); - } - Notification.getActiveNotifications(getActiveNotificationsCallback); - ``` - - - -- 获取当前应用的活动通知(Promise形式) - - Notification.getActiveNotifications() - - - 参数描述 - - 无 - - - 返回值 +} + +//通知发送 +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)); +}); +``` - Promise> - - 示例代码 - ```js - Notification.getActiveNotifications().then((data) => { - console.info("==========================>getActiveNotificationsCallback=======================>"); - }); - ``` +携带wantAgent通知实例 +wantAgent使用详见[wantAgent开发文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/wantagent.md)。 +- 创建wantAgent对象 -#### WantAgent接口 +```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) +``` -##### 导入模块 +- 发布通知 ```js -import WantAgent from '@ohos.wantAgent'; +//构造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)); +}); ``` -##### WantAgentInfo类型说明 - -WantAgentInfo类封装了获取一个WantAgent实例所需的数据。 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| -------------- | -------- | ------------------------------- | ---- | ---------------------- | -| wants | 读、写 | Array | 是 | 将被执行的动作列表 | -| operationType | 读、写 | wantAgent.OperationType | 是 | 动作类型 | -| requestCode | 读、写 | number | 是 | 使用者定义的一个私有值 | -| wantAgentFlags | 读、写 | Array | 否 | 动作执行属性 | -| extraInfo | 读、写 | {[key: string]: any} | 否 | 额外数据 | - -- OperationType类型说明 - -| 名称 | 读写属性 | 类型 | 描述 | -| ----------------- | -------- | ---- | ----------------------- | -| UNKNOWN_TYPE | 只读 | enum | 不识别的类型 | -| START_ABILITY | 只读 | enum | 开启一个有页面的Ability | -| START_ABILITIES | 只读 | enum | 开启多个有页面的Ability | -| START_SERVICE | 只读 | enum | 开启一个无页面的ability | -| SEND_COMMON_EVENT | 只读 | enum | 发送一个公共事件 | - -- WantAgentFlags类型说明 - - -| 名称 | 读写属性 | 类型 | 描述 | -| ------------------- | -------- | ---- | ------------------------------------------------------------ | -| ONE_TIME_FLAG | 只读 | enum | WantAgent仅能使用一次 | -| NO_BUILD_FLAG | 只读 | enum | 如果描述WantAgent对象不存在,则不创建它,直接返回null | -| CANCEL_PRESENT_FLAG | 只读 | enum | 在生成一个新的WantAgent对象前取消已存在的一个WantAgent对象 | -| UPDATE_PRESENT_FLAG | 只读 | enum | 使用新的WantAgent的额外数据替换已存在的WantAgent中的额外数据 | -| CONSTANT_FLAG | 只读 | enum | WantAgent是不可变的 | -| REPLACE_ELEMENT | 只读 | enum | 当前Want中的element属性可被WantAgent.trigger()中Want的element属性取代 | -| REPLACE_ACTION | 只读 | enum | 当前Want中的action属性可被WantAgent.trigger()中Want的action属性取代 | -| REPLACE_URI | 只读 | enum | 当前Want中的uri属性可被WantAgent.trigger()中Want的uri属性取代 | -| REPLACE_ENTITIES | 只读 | enum | 当前Want中的entities属性可被WantAgent.trigger()中Want的entities属性取代 | -| REPLACE_BUNDLE | 只读 | enum | 当前Want中的bundleName属性可被WantAgent.trigger()中Want的bundleName属性取代 | - - - -##### TriggerInfo类型说明 - -TriggerInfo类封装了主动激发一个WantAgent实例所需的数据。 - -| 名称 | 读写属性 | 类型 | 必填 | 描述 | -| ---------- | -------- | -------------------- | ---- | ----------- | -| code | 读、写 | number | 是 | result code | -| want | 读、写 | Want | 否 | Want | -| permission | 读、写 | string | 否 | 权限定义 | -| extraInfo | 读、写 | {[key: string]: any} | 否 | 额外数据 | - - - -##### 创建WantAgent - -- 创建WantAgent(callback形式) - - WantAgent.getWantAgent(info: WantAgentInfo, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------------ | ---- | ----------------------- | - | info | 只读 | WantAgentInfo | 是 | WantAgent信息 | - | callback | 只读 | AsyncCallback | 是 | 创建WantAgent的回调方法 | - - 返回值 - - void - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - ``` - - - -- 创建WantAgent(Promise形式) - - WantAgent.getWantAgent(info: WantAgentInfo): Promise - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ---- | -------- | ------------- | ---- | ------------- | - | info | 只读 | WantAgentInfo | 是 | WantAgent信息 | - - 返回值 - - Promise - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - wantAgent.getWantAgent(wantAgentInfo).then((data) => { - ``` - - console.info("==========================>getWantAgentCallback=======================>"); - }); - - ``` - - ``` +- 取消通知 +取消通知可以分成取消指定的单条通知和取消所有通知,应用只能取消自己发布的通知。 +```js +//cancel回调 +function cancelCallback(err) { + console.info("===>cancelCallback===>"); +} -##### 获取WantAgent实例的包名 +Notification.cancel(1, "label", cancelCallback) +``` -- 获取WantAgent实例的包名(callback形式) - WantAgent.getBundleName(agent: WantAgent, callback: AsyncCallback) - - 参数描述 +## 开发实例 - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | --------------------- | ---- | ---------------------------------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | callback | 只读 | AsyncCallback | 是 | 获取WantAgent指定的bundle name的回调方法 | +针对通知开发,有以下示例工程可供参考: - - 返回值 +- notification - void +本示例展示了在eTS中如何使用Notification的接口完成通知订阅、取消订阅、发布通知、取消通知、查询和开启通知使能功能。 - - 示例代码 - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - //wantAgent对象 - var WantAgent; - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - if (err.code == 0) { - WantAgent = data; - } else { - console.info('----getWantAgent failed!----'); - } - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - //getBundleName回调 - function getBundleNameCallback(err, data) { - console.info("==========================>getBundleNameCallback=======================>"); - } - wantAgent.getBundleName(WantAgent, getBundleNameCallback) - ``` - - - -- 获取WantAgent实例的包名(Promise形式) - - WantAgent.getBundleName(agent: WantAgent): Promise - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ----- | -------- | --------- | ---- | ------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - - 返回值 - - Promise - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - //wantAgent对象 - var WantAgent; - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - wantAgent.getWantAgent(wantAgentInfo).then((data) => { - console.info("==========================>getWantAgentCallback=======================>"); - WantAgent = data; - }); - wantAgent.getBundleName(WantAgent).then((data) => { - console.info("==========================>getBundleNameCallback=======================>"); - }); - ``` - - - - -##### 获取WantAgent实例的用户ID - -- 获取WantAgent实例的用户ID(callback形式) - - WantAgent.getUid(agent: WantAgent, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | --------------------- | ---- | ----------------------------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | callback | 只读 | AsyncCallback | 是 | 获取WantAgent实例的用户ID的回调方法 | - - 返回值 - - void - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent; - - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - if (err.code == 0) { - WantAgent = data; - } else { - console.info('----getWantAgent failed!----'); - } - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - - //getUid回调 - function getUidCallback(err, data) { - console.info("==========================>getUidCallback=======================>"); - } - wantAgent.getUid(WantAgent, getUidCallback) - ``` - - - -- 获取WantAgent实例的用户ID(Promise形式) - - WantAgent.getUid(agent: WantAgent): Promise - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ----- | -------- | --------- | ---- | ------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - - 返回值 - - Promise - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent; - - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo).then((data) => { - console.info("==========================>getWantAgentCallback=======================>"); - WantAgent = data; - }); - - wantAgent.getUid(WantAgent).then((data) => { - console.info("==========================>getUidCallback=======================>"); - }); - ``` - - - -##### 取消WantAgent实例 - -- 取消WantAgent实例(callback形式) - - WantAgent.cancel(agent: WantAgent, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ------------------- | ---- | --------------------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | callback | 只读 | AsyncCallback | 是 | 取消WantAgent实例的回调方法 | - - 返回值 - - void - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent; - - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - if (err.code == 0) { - WantAgent = data; - } else { - console.info('----getWantAgent failed!----'); - } - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - - //cancel回调 - function cancelCallback(err, data) { - console.info("==========================>cancelCallback=======================>"); - } - wantAgent.cancel(WantAgent, cancelCallback) - ``` - - - -- 取消WantAgent实例(Promise形式) - - WantAgent.cancel(agent: WantAgent): Promise - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ----- | -------- | --------- | ---- | ------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - - 返回值 - - Promise - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent; - - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo).then((data) => { - console.info("==========================>getWantAgentCallback=======================>"); - WantAgent = data; - }); - - wantAgent.cancel(WantAgent).then((data) => { - console.info("==========================>cancelCallback=======================>"); - }); - ``` - - - - -##### 主动激发WantAgent实例 - -- 主动激发WantAgent实例(callback形式) - - WantAgent.trigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: Callback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ----------- | -------- | --------------------------- | ---- | ------------------------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | triggerInfo | 只读 | TriggerInfo | 是 | TriggerInfo对象 | - | callback | 只读 | AsyncCallback | 是 | 主动激发WantAgent实例的回调方法 | - - 返回值 - - void - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent; - - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - if (err.code == 0) { - WantAgent = data; - } else { - console.info('----getWantAgent failed!----'); - } - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - - //cancel回调 - function triggerCallback(err, data) { - console.info("==========================>triggerCallback=======================>"); - } - wantAgent.trigger(WantAgent, triggerCallback) - ``` - - - - -##### 判断两个WantAgent实例是否相等 - -- 判断两个WantAgent实例是否相等(callback形式) - - WantAgent.equal(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallback) - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ---------- | -------- | ---------------------- | ---- | --------------------------------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | otherAgent | 只读 | WantAgent | 是 | WantAgent对象 | - | callback | 只读 | AsyncCallback | 是 | 判断两个WantAgent实例是否相等的回调方法 | - - 返回值 - - void - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent1; - var WantAgent2; - - //getWantAgent回调 - function getWantAgentCallback(err, data) { - console.info("==========================>getWantAgentCallback=======================>"); - if (err.code == 0) { - WantAgent1 = data; - WantAgent2 = data; - } else { - console.info('----getWantAgent failed!----'); - } - } - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) - - //cancel回调 - function equalCallback(err, data) { - console.info("==========================>equalCallback=======================>"); - } - wantAgent.equal(WantAgent1, WantAgent1, equalCallback) - ``` - - - -- 判断两个WantAgent实例是否相等(Promise形式) - - WantAgent.equal(agent: WantAgent, otherAgent: WantAgent): Promise - - - 参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | ---------- | -------- | --------- | ---- | ------------- | - | agent | 只读 | WantAgent | 是 | WantAgent对象 | - | otherAgent | 只读 | WantAgent | 是 | WantAgent对象 | - - 返回值 - - Promise - - - 示例代码 - - ```js - import wantAgent from '@ohos.wantAgent'; - import { OperationType, Flags } from '@ohos.wantagent'; - - //wantAgent对象 - var WantAgent1; - var WantAgent2; - - //WantAgentInfo对象 - var wantAgentInfo = { - wants: [ - { - deviceId: "deviceId", - bundleName: "com.neu.setResultOnAbilityResultTest1", - abilityName: "com.example.test.MainAbility", - action: "action1", - entities: ["entity1"], - type: "MIMETYPE", - uri: "key={true,true,false}", - parameters: - { - mykey0: 2222, - mykey1: [1, 2, 3], - mykey2: "[1, 2, 3]", - mykey3: "ssssssssssssssssssssssssss", - mykey4: [false, true, false], - mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], - mykey6: true, - } - } - ], - operationType: OperationType.START_ABILITIES, - requestCode: 0, - wantAgentFlags:[Flags.UPDATE_PRESENT_FLAG] - } - - wantAgent.getWantAgent(wantAgentInfo).then((data) => { - console.info("==========================>getWantAgentCallback=======================>"); - WantAgent = data; - }); - - wantAgent.equal(WantAgent1, WantAgent2).then((data) => { - console.info("==========================>equalCallback=======================>"); - }); - ``` -- GitLab