1# 连接ServiceAbility 2 3 4如果ServiceAbility需要与PageAbility或其他应用的ServiceAbility进行交互,则须创建用于连接的Connection。ServiceAbility支持其他Ability通过connectAbility()方法与其进行连接。PageAbility的connectAbility方法定义在featureAbility中,ServiceAbility的connectAbility方法定义在particleAbility中。连接ServiceAbility的规则详见[组件启动规则](component-startup-rules.md)章节。在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现。 5 6 7 **表1** IAbilityConnection接口说明 8 9| 接口名 | 描述 | 10| -------- | -------- | 11| onConnect() | 用于处理连接Service成功的回调。 | 12| onDisconnect() | 用来处理Service异常死亡的回调。 | 13| onFailed() | 用来处理连接Service失败的回调。 | 14 15 16PageAbility创建连接本地ServiceAbility回调实例的代码以及连接本地ServiceAbility的示例代码如下: 17 18```ts 19import rpc from "@ohos.rpc" 20import promptAction from '@ohos.promptAction' 21import featureAbility from '@ohos.ability.featureAbility' 22import common from '@ohos.app.ability.common'; 23import Want from '@ohos.app.ability.Want'; 24import promptAction from '@ohos.promptAction'; 25import rpc from '@ohos.rpc'; 26import hilog from '@ohos.hilog'; 27``` 28```ts 29const LOG_TAG: string = '[Sample_FAModelAbilityDevelop]'; 30const LOG_DOMAIN: number = 0xFF00; 31let option: common.ConnectOptions = { 32 onConnect: (element, proxy) => { 33 hilog.info(LOG_DOMAIN, LOG_TAG, 'onConnectLocalService onConnectDone element:' + JSON.stringify(element)); 34 if (proxy === null) { 35 promptAction.showToast({ 36 message: 'connect service failed' 37 }); 38 return; 39 } 40 let data = rpc.MessageParcel.create() 41 let reply = rpc.MessageParcel.create() 42 let option = new rpc.MessageOption() 43 data.writeInterfaceToken("connect.test.token") 44 proxy.sendRequest(0, data, reply, option) 45 promptAction.showToast({ 46 message: 'connect service success' 47 }); 48 }, 49 onDisconnect: (element) => { 50 hilog.info(LOG_DOMAIN, LOG_TAG, `onConnectLocalService onDisconnectDone element:${element}`); 51 promptAction.showToast({ 52 message: 'disconnect service success' 53 }); 54 }, 55 onFailed: (code) => { 56 hilog.info(LOG_DOMAIN, LOG_TAG, `onConnectLocalService onFailed errCode:${code}`); 57 promptAction.showToast({ 58 message: 'connect service failed' 59 }); 60 } 61}; 62 63let request: Want = { 64 bundleName: 'com.samples.famodelabilitydevelop', 65 abilityName: 'com.samples.famodelabilitydevelop.ServiceAbility', 66}; 67let connId = featureAbility.connectAbility(request, option); 68hilog.info(LOG_DOMAIN, LOG_TAG, `connectAbility id:${connId}`); 69``` 70 71 72同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象。系统提供了IRemoteObject的默认实现,开发者可以通过继承rpc.RemoteObject来创建自定义的实现类。 73 74 75Service侧把自身的实例返回给调用侧的示例代码如下: 76 77```ts 78import rpc from "@ohos.rpc" 79 80class FirstServiceAbilityStub extends rpc.RemoteObject { 81 constructor(des: Object) { 82 if (typeof des === 'string') { 83 super(des) 84 } else { 85 return 86 } 87 } 88 89 onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel, option: rpc.MessageOption) { 90 console.info(`onRemoteRequest called`) 91 if (code === 1) { 92 let string = data.readString() 93 console.info(`string=${string}`) 94 let result = Array.from(string).sort().join('') 95 console.info(`result=${result}`) 96 reply.writeString(result) 97 } else { 98 console.info(`unknown request code`) 99 } 100 return true 101 } 102} 103``` 104