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 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. 在手机应用中查看是否可以收到快捷消息。如果可以,表明功能实现正常。