1# ServiceAbility开发说明 2 3- [创建Service](#section17436202895812) 4- [启动Service](#section944219415599) 5- [连接Service](#section126857614018) 6 7## 创建Service<a name="section17436202895812"></a> 8 91. Service也是一种Ability,Ability为Service提供了以下生命周期方法,开发者可以重写这些方法,来添加其他Ability请求与Service Ability交互时的处理方法。 10 11 - onStart() 12 13 该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Want应为空。 14 15 - onCommand() 16 17 在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,开发者可以在该方法中做一些调用统计、初始化类的操作。 18 19 - onConnect() 20 21 在Ability和Service连接时调用,该方法返回IRemoteObject对象,开发者可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。 22 23 - onDisconnect() 24 25 在Ability与绑定的Service断开连接时调用。 26 27 - onStop() 28 29 在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。 30 31 创建Service的代码示例如下: 32 33 ```javascript 34 export default { 35 onStart(want) { 36 console.log('SerivceAbility onStart'); 37 }, 38 onCommand(want, restart, startId) { 39 console.log('SerivceAbility onCommand'); 40 }, 41 onConnect(want) { 42 console.log('SerivceAbility OnConnect'); 43 }, 44 onDisconnect() { 45 console.log('SerivceAbility OnDisConnect'); 46 }, 47 onStop() { 48 console.log('SerivceAbility onStop'); 49 }, 50 } 51 ``` 52 532. 注册Service。 54 55 Service也需要在应用配置文件config.json中进行注册,注册类型type需要设置为service。 56 57 ```javascript 58 { 59 "module": { 60 "abilities": [ 61 { 62 "name": ".ServiceAbility", 63 "type": "service", 64 "visible": true 65 ... 66 } 67 ] 68 ... 69 } 70 ... 71 } 72 ``` 73 74 75 76 77## 启动Service<a name="section944219415599"></a> 78 79Ability为开发者提供了startAbility()方法来启动另外一个Ability。因为Service也是Ability的一种,开发者同样可以通过将Want传递给该方法来启动Service。 80 81开发者可以通过构造包含BundleName与AbilityName的Want对象来设置目标Service信息。参数的含义如下: 82 83- BundleName:表示包名称。 84- AbilityName:表示待启动的Ability名称。 85 86启动本地设备Service的代码示例如下: 87 88```javascript 89import featureAbility from '@ohos.ability.featureability'; 90var promise = await featureAbility.startAbility( 91 { 92 want: 93 { 94 bundleName: "com.jstest.serviceability", 95 abilityName: "com.jstest.serviceability.MainAbility", 96 }, 97 } 98); 99``` 100 101- 执行上述代码后,Ability将通过startAbility() 方法来启动Service。 102 - 如果Service尚未运行,则系统会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。 103 - 如果Service正在运行,则系统会直接回调Service的onCommand()方法来启动Service。 104 105- 停止Service 106 107 Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。开发者可以在Service中通过terminateAbility()停止本Service或在其他Ability调用stopAbility()来停止Service。 108 109 110 111## 连接Service<a name="section126857614018"></a> 112 113如果Service需要与Page Ability或其他应用的Service Ability进行交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。 114 115在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。 116 117创建连接Service回调实例的代码示例如下: 118 119```javascript 120var mRemote; 121function onConnectCallback(element, remote){ 122 console.log('ConnectAbility onConnect Callback') 123 mRemote = remote; 124} 125 126function onDisconnectCallback(element){ 127 console.log('ConnectAbility onDisconnect Callback') 128} 129 130function onFailedCallback(code){ 131 console.log('ConnectAbility onFailed Callback') 132} 133``` 134 135连接Service的代码示例如下: 136 137```javascript 138import featureAbility from '@ohos.ability.featureability'; 139var connId = featureAbility.connectAbility( 140 { 141 bundleName: "com.jstest.serviceability", 142 abilityName: "com.jstest.serviceability.MainAbility", 143 }, 144 { 145 onConnect: onConnectCallback, 146 onDisconnect: onDisconnectCallback, 147 onFailed: onFailedCallback, 148 }, 149); 150``` 151 152同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象,HarmonyOS提供了IRemoteObject的默认实现,用户可以通过继承rpc.RemoteObject来创建自定义的实现类。 153 154Service侧把自身的实例返回给调用侧的代码示例如下: 155 156```javascript 157import rpc from "@ohos.rpc"; 158 159var mMyStub; 160export default { 161 onStart(want) { 162 class MyStub extends rpc.RemoteObject{ 163 constructor(des) { 164 if (typeof des === 'string') { 165 super(des, des.length); 166 } 167 return null; 168 } 169 onRemoteRequest(code, message, reply, option) { 170 } 171 } 172 mMyStub = new MyStub("ServiceAbility-test"); 173 }, 174 onCommand(want, restart, startId) { 175 console.log('SerivceAbility onCommand'); 176 }, 177 onConnect(want) { 178 console.log('SerivceAbility OnConnect'); 179 return mMyStub; 180 }, 181 onDisconnect() { 182 console.log('SerivceAbility OnDisConnect'); 183 }, 184 onStop() { 185 console.log('SerivceAbility onStop'); 186 }, 187} 188``` 189 190