• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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