1# 连接ServiceAbility 2<!--Kit: Ability Kit--> 3<!--Subsystem: Ability--> 4<!--Owner: @xialiangwei--> 5<!--Designer: @jsjzju--> 6<!--Tester: @lixueqing513--> 7<!--Adviser: @huipeizi--> 8<!--deprecated_code_no_check--> 9 10如果ServiceAbility需要与PageAbility或其他应用的ServiceAbility进行交互,则须创建用于连接的Connection。ServiceAbility支持其他Ability通过[connectAbility()](../reference/apis-ability-kit/js-apis-ability-featureAbility.md#featureabilityconnectability7)方法与其进行连接。PageAbility的connectAbility()方法定义在[featureAbility](../reference/apis-ability-kit/js-apis-ability-featureAbility.md)中,ServiceAbility的connectAbility()方法定义在[particleAbility](../reference/apis-ability-kit/js-apis-ability-particleAbility.md)中。连接ServiceAbility的规则详见[组件启动规则](component-startup-rules-fa.md)章节。在使用connectAbility()处理回调时,需要传入目标Service的[Want](../reference/apis-ability-kit/js-apis-app-ability-want.md)与[IAbilityConnection](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md)的实例。[IAbilityConnection](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md)提供了以下方法供开发者实现。 11 12 13 **表1** IAbilityConnection接口说明 14 15| 接口名 | 描述 | 16| -------- | -------- | 17| onConnect() | 用于处理连接Service成功的回调。 | 18| onDisconnect() | 用来处理Service异常死亡的回调。 | 19| onFailed() | 用来处理连接Service失败的回调。 | 20 21 22PageAbility创建连接本地ServiceAbility回调实例的代码以及连接本地ServiceAbility的示例代码如下: 23 24```ts 25import featureAbility from '@ohos.ability.featureAbility'; 26import common from '@ohos.app.ability.common'; 27import Want from '@ohos.app.ability.Want'; 28import promptAction from '@ohos.promptAction'; 29import rpc from '@ohos.rpc'; 30import hilog from '@ohos.hilog'; 31``` 32```ts 33const TAG: string = 'PageServiceAbility'; 34const domain: number = 0xFF00; 35 36@Entry 37@Component 38struct PageServiceAbility { 39 //... 40 build() { 41 Column() { 42 //... 43 List({ initialIndex: 0 }) { 44 ListItem() { 45 Row() { 46 //... 47 } 48 .onClick(() => { 49 let option: common.ConnectOptions = { 50 onConnect: (element, proxy) => { 51 hilog.info(domain, TAG, `onConnectLocalService onConnectDone element:` + JSON.stringify(element)); 52 if (proxy === null) { 53 promptAction.showToast({ 54 message: 'connect_service_failed_toast' 55 }); 56 return; 57 } 58 let data = rpc.MessageParcel.create(); 59 let reply = rpc.MessageParcel.create(); 60 let option = new rpc.MessageOption(); 61 data.writeInterfaceToken('connect.test.token'); 62 proxy.sendRequest(0, data, reply, option); 63 promptAction.showToast({ 64 message: 'connect_service_success_toast' 65 }); 66 }, 67 onDisconnect: (element) => { 68 hilog.info(domain, TAG, `onConnectLocalService onDisconnectDone element:${element}`); 69 promptAction.showToast({ 70 message: 'disconnect_service_success_toast' 71 }); 72 }, 73 onFailed: (code) => { 74 hilog.info(domain, TAG, `onConnectLocalService onFailed errCode:${code}`); 75 promptAction.showToast({ 76 message: 'connect_service_failed_toast' 77 }); 78 } 79 }; 80 81 let request: Want = { 82 bundleName: 'com.samples.famodelabilitydevelop', 83 abilityName: 'com.samples.famodelabilitydevelop.ServiceAbility', 84 }; 85 let connId = featureAbility.connectAbility(request, option); 86 hilog.info(domain, TAG, `onConnectLocalService onFailed errCode:${connId}`); 87 }) 88 } 89 //... 90 } 91 //... 92 } 93 //... 94 } 95} 96``` 97 98 99同时,Service侧也需要在[onConnect()](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md#onconnect)时返回[IRemoteObject](../reference/apis-ipc-kit/js-apis-rpc.md#iremoteobject),从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象。系统提供了IRemoteObject的默认实现,开发者可以通过继承[rpc.RemoteObject](../reference/apis-ipc-kit/js-apis-rpc.md#remoteobject)来创建自定义的实现类。 100 101 102Service侧把自身的实例返回给调用侧的示例代码如下: 103 104```ts 105import type Want from '@ohos.app.ability.Want'; 106import rpc from '@ohos.rpc'; 107import hilog from '@ohos.hilog'; 108 109const TAG: string = '[Sample_FAModelAbilityDevelop]'; 110const domain: number = 0xFF00; 111 112class FirstServiceAbilityStub extends rpc.RemoteObject { 113 constructor(des: Object) { 114 if (typeof des === 'string') { 115 super(des); 116 } else { 117 return; 118 } 119 } 120 121 onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel, option: rpc.MessageOption): boolean { 122 hilog.info(domain, TAG, 'ServiceAbility onRemoteRequest called'); 123 if (code === 1) { 124 let string = data.readString(); 125 hilog.info(domain, TAG, `ServiceAbility string=${string}`); 126 let result = Array.from(string).sort().join(''); 127 hilog.info(domain, TAG, `ServiceAbility result=${result}`); 128 reply.writeString(result); 129 } else { 130 hilog.info(domain, TAG, 'ServiceAbility unknown request code'); 131 } 132 return true; 133 } 134} 135//... 136``` 137