• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 为跨设备协同通知添加快捷回复
2
3从API version 18开始,支持为跨设备协同通知添加快捷回复。
4
5当手机应用通过指定事件ID订阅通知回复事件、并发布支持快捷回复的通知到手表时,用户无需解锁手机,即可在手表上查看通知消息并快捷回复。
6
7## 前提条件
8
9 - 用户已通过手机中运动健康App连接手表。
10 - 用户已在手机的“运动健康App > 设备 > 消息通知”中,开启通知总开关与当前应用的通知开关。
11
12## 实现原理
13
14快捷回复的实现原理如下。其中,开发者仅需要实现步骤1和步骤2,步骤6为用户操作,其他均由系统实现。
15
16![notification_introduction](figures/notification_quickreply.png)
17
18## 接口说明
19
20| **接口名**  | **描述** |
21| -------- | -------- |
22| [publish](../reference/apis-notification-kit/js-apis-notificationManager.md#notificationmanagerpublish-1)(request: NotificationRequest): Promise\<void\>       | 发布通知。  |
23| [on](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#calleeon)(method: string, callback: CalleeCallback): void       | 通用组件服务端注册消息通知callback。  |
24
25## 开发步骤
26
271. 导入模块。
28
29    ```typescript
30    import { notificationManager } from '@kit.NotificationKit';
31    import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
32    import { window } from '@kit.ArkUI';
33    import { rpc } from '@kit.IPCKit';
34    import { BusinessError } from '@kit.BasicServicesKit';
35    import { hilog } from '@kit.PerformanceAnalysisKit';
36    import { common } from '@kit.AbilityKit';
37
38    const TAG: string = '[PublishOperation]';
39    const DOMAIN_NUMBER: number = 0xFF00;
40    ```
41
422. 手机中应用订阅通知回复事件。
43
44    ```typescript
45    class MySequenceable implements rpc.Parcelable {
46      inputKey: string = ""
47      userInput: string = ""
48
49      constructor(inputKey: string, userInput: string) {
50        this.inputKey = inputKey
51        this.userInput = userInput
52      }
53
54      marshalling(messageParcel: rpc.MessageSequence) {
55        messageParcel.writeString(this.inputKey)
56        messageParcel.writeString(this.userInput)
57        return true
58      }
59
60      unmarshalling(messageParcel: rpc.MessageSequence) {
61        this.inputKey = messageParcel.readString()
62        this.userInput = messageParcel.readString()
63        return true
64      }
65    }
66
67    function sendMsgCallback(data: rpc.MessageSequence) {
68      // 获取客户端发送的序列化数据
69      let receivedData = new MySequenceable('', '')
70      // receivedData.inputKey为value1.
71      receivedData.inputKey = data.readString();
72      // receivedData.userInput为用户指定的快捷回复内容。
73      receivedData.userInput = data.readString();
74      hilog.info(0x0000, '01203', "inputKey : " + JSON.stringify(receivedData.inputKey));
75      hilog.info(0x0000, '01203', "userInput : " + JSON.stringify(receivedData.userInput));
76
77      return new MySequenceable('', '')
78    }
79
80    export default class EntryAbility extends UIAbility {
81      onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
82        hilog.info(0x0000, '01203', '%{public}s', 'Ability onCreate');
83        hilog.info(0x0000, '01203', 'onCreate %{public}s', JSON.stringify(want));
84        try {
85          // 服务端注册消息通知回调sendMsgCallback,且必须订阅com.ohos.notification_service.sendReply
86          this.callee.on('com.ohos.notification_service.sendReply', sendMsgCallback)
87        } catch (error) {
88          hilog.error(DOMAIN_NUMBER, TAG, `Failed to register. Code is ${error.code}, message is ${error.message}`);
89        }
90        hilog.info(0x0000, '01203', 'register successfully');
91      }
92    }
93    ```
94
953. 发布可快捷回复的通知消息。该通知必须携带有`userInput`的`actionButtons`,且`notificationSlotType`必须为`SOCIAL_COMMUNICATION`。
96
97    ```typescript
98    // 用于保存创建成功的wantAgent对象,后续使用其完成触发的动作。
99    let wantAgentObj:WantAgent;
100    // 该wantAgentInfo的abilityName必须为步骤二的EntryAbility。
101    let wantAgentInfo:wantAgent.WantAgentInfo = {
102      wants: [
103        {
104          deviceId: '',
105          bundleName: 'com.samples.notification',
106          abilityName: 'EntryAbility',
107          action: '',
108          entities: [],
109          uri: '',
110          parameters: {}
111        }
112      ],
113      actionType: wantAgent.OperationType.START_ABILITY,
114      requestCode: 0,
115      wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG]
116    };
117    // 创建WantAgent
118    wantAgent.getWantAgent(wantAgentInfo, (err: BusinessError, data:WantAgent) => {
119      if (err) {
120         hilog.error(DOMAIN_NUMBER, TAG, `Failed to get want agent. Code is ${err.code}, message is ${err.message}`);
121         return;
122      }
123      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in getting want agent.');
124      wantAgentObj = data;
125      let notificationRequest: notificationManager.NotificationRequest = {
126        id: 1,
127        // notificationSlotType必须为SOCIAL_COMMUNICATION
128        notificationSlotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
129        content: {
130          notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
131          normal: {
132            title: 'Test_Title',
133            text: 'Test_Text',
134            additionalText: 'Test_AdditionalText',
135          },
136        },
137        actionButtons: [{
138          title: "button1",
139          wantAgent: wantAgentObj,
140          // 必须携带userInput
141          userInput: {"inputKey": "value1"},
142        }],
143      }
144      // 发布通知
145      notificationManager.publish(notificationRequest, (err: BusinessError) => {
146        if (err) {
147          hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
148          return;
149        }
150        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
151      });
152    });
153   ```
154
155## 调试验证
156
1571. 手表上进行快捷回复。
158
1592. 在手机应用中查看是否可以收到快捷消息。如果可以,表明功能实现正常。