1# Connecting to a 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 10If a ServiceAbility wants to interact with a PageAbility or a ServiceAbility in another application, you must first create a connection by calling [connectAbility()](../reference/apis-ability-kit/js-apis-ability-featureAbility.md#featureabilityconnectability7). This method is defined in the [featureAbility](../reference/apis-ability-kit/js-apis-ability-featureAbility.md) class for the PageAbility and in the [particleAbility](../reference/apis-ability-kit/js-apis-ability-particleAbility.md) class for the ServiceAbility. For details about the connection rules, see [Component Startup Rules](component-startup-rules-fa.md). When using **connectAbility()** to process the callback, pass in the instances of [Want](../reference/apis-ability-kit/js-apis-app-ability-want.md) and [IAbilityConnection](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md) of the target ServiceAbility. [IAbilityConnection](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md) provides the following callbacks that you should implement. 11 12 13**Table 1** IAbilityConnection APIs 14 15| API| Description| 16| -------- | -------- | 17| onConnect() | Callback invoked when the ServiceAbility is connected.| 18| onDisconnect() | Callback invoked when the ServiceAbility is disconnected.| 19| onFailed() | Callback invoked when the connection to the ServiceAbility fails.| 20 21 22The following sample code enables the PageAbility to create connection callback instances and connect to the local 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 99When the ServiceAbility is connected, the [onConnect()](../reference/apis-ability-kit/js-apis-inner-ability-connectOptions.md#onconnect) callback is invoked and returns an [IRemoteObject](../reference/apis-ipc-kit/js-apis-rpc.md#iremoteobject) defining the proxy used for communicating with the ServiceAbility. The system provides a default implementation of **IRemoteObject**. You can extend [rpc.RemoteObject](../reference/apis-ipc-kit/js-apis-rpc.md#remoteobject) to implement your own class of **IRemoteObject**. 100 101 102The following sample code shows how the ServiceAbility returns itself to the caller: 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