ServiceAbility开发说明

创建Service

  1. Service也是一种Ability,Ability为Service提供了以下生命周期方法,开发者可以重写这些方法,来添加其他Ability请求与Service Ability交互时的处理方法。

    • onStart()

      该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Want应为空。

    • onCommand()

      在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,开发者可以在该方法中做一些调用统计、初始化类的操作。

    • onConnect()

      在Ability和Service连接时调用,该方法返回IRemoteObject对象,开发者可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。

    • onDisconnect()

      在Ability与绑定的Service断开连接时调用。

    • onStop()

      在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。

    创建Service的代码示例如下:

    1. export default {
    2. onStart(want) {
    3. console.log('SerivceAbility onStart');
    4. },
    5. onCommand(want, restart, startId) {
    6. console.log('SerivceAbility onCommand');
    7. },
    8. onConnect(want) {
    9. console.log('SerivceAbility OnConnect');
    10. },
    11. onDisconnect() {
    12. console.log('SerivceAbility OnDisConnect');
    13. },
    14. onStop() {
    15. console.log('SerivceAbility onStop');
    16. },
    17. }
  2. 注册Service。

    Service也需要在应用配置文件config.json中进行注册,注册类型type需要设置为service。

    1. {
    2. "module": {
    3. "abilities": [
    4. {
    5. "name": ".ServiceAbility",
    6. "type": "service",
    7. "visible": true
    8. ...
    9. }
    10. ]
    11. ...
    12. }
    13. ...
    14. }

启动Service

Ability为开发者提供了startAbility()方法来启动另外一个Ability。因为Service也是Ability的一种,开发者同样可以通过将Want传递给该方法来启动Service。

开发者可以通过构造包含BundleName与AbilityName的Want对象来设置目标Service信息。参数的含义如下:

  • BundleName:表示包名称。
  • AbilityName:表示待启动的Ability名称。

启动本地设备Service的代码示例如下:

  1. import featureAbility from '@ohos.ability.featureability';
  2. var promise = await featureAbility.startAbility(
  3. {
  4. want:
  5. {
  6. bundleName: "com.jstest.serviceability",
  7. abilityName: "com.jstest.serviceability.MainAbility",
  8. },
  9. }
  10. );
  • 执行上述代码后,Ability将通过startAbility() 方法来启动Service。

    • 如果Service尚未运行,则系统会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。
    • 如果Service正在运行,则系统会直接回调Service的onCommand()方法来启动Service。
  • 停止Service

    Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。开发者可以在Service中通过terminateAbility()停止本Service或在其他Ability调用stopAbility()来停止Service。

连接本地Service

如果Service需要与Page Ability或其他应用的Service Ability进行交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。

在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。

创建连接本地Service回调实例的代码示例如下:

  1. var mRemote;
  2. function onConnectCallback(element, remote){
  3. console.log('ConnectAbility onConnect Callback')
  4. mRemote = remote;
  5. }
  6. function onDisconnectCallback(element){
  7. console.log('ConnectAbility onDisconnect Callback')
  8. }
  9. function onFailedCallback(code){
  10. console.log('ConnectAbility onFailed Callback')
  11. }

连接本地Service的代码示例如下:

  1. import featureAbility from '@ohos.ability.featureability';
  2. var connId = featureAbility.connectAbility(
  3. {
  4. bundleName: "com.jstest.serviceability",
  5. abilityName: "com.jstest.serviceability.MainAbility",
  6. },
  7. {
  8. onConnect: onConnectCallback,
  9. onDisconnect: onDisconnectCallback,
  10. onFailed: onFailedCallback,
  11. },
  12. );

同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象,OpenHarmony提供了IRemoteObject的默认实现,用户可以通过继承rpc.RemoteObject来创建自定义的实现类。

Service侧把自身的实例返回给调用侧的代码示例如下:

  1. import rpc from "@ohos.rpc";
  2. var mMyStub;
  3. export default {
  4. onStart(want) {
  5. class MyStub extends rpc.RemoteObject{
  6. constructor(des) {
  7. if (typeof des === 'string') {
  8. super(des);
  9. }
  10. return null;
  11. }
  12. onRemoteRequest(code, message, reply, option) {
  13. }
  14. }
  15. mMyStub = new MyStub("ServiceAbility-test");
  16. },
  17. onCommand(want, restart, startId) {
  18. console.log('SerivceAbility onCommand');
  19. },
  20. onConnect(want) {
  21. console.log('SerivceAbility OnConnect');
  22. return mMyStub;
  23. },
  24. onDisconnect() {
  25. console.log('SerivceAbility OnDisConnect');
  26. },
  27. onStop() {
  28. console.log('SerivceAbility onStop');
  29. },
  30. }

连接远程Service

如果Service需要与Page Ability或其他应用的Service Ability进行跨设备交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行跨设备连接。

在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。

创建连接远程Service回调实例的代码示例如下:

  1. var mRemote;
  2. function onConnectCallback(element, remote){
  3. console.log('ConnectRemoteAbility onConnect Callback')
  4. mRemote = remote;
  5. }
  6. function onDisconnectCallback(element){
  7. console.log('ConnectRemoteAbility onDisconnect Callback')
  8. }
  9. function onFailedCallback(code){
  10. console.log('ConnectRemoteAbility onFailed Callback')
  11. }

目标Service的Want需要包含远程deviceId,该远程deviceId可通过deviceManager获取。

连接远程Service的代码示例如下:

  1. import featureAbility from '@ohos.ability.featureability';
  2. var connId = featureAbility.connectAbility(
  3. {
  4. deviceId: deviceId,
  5. bundleName: "com.jstest.serviceability",
  6. abilityName: "com.jstest.serviceability.MainAbility",
  7. },
  8. {
  9. onConnect: onConnectCallback,
  10. onDisconnect: onDisconnectCallback,
  11. onFailed: onFailedCallback,
  12. },
  13. );

同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象,OpenHarmony提供了IRemoteObject的默认实现,用户可以通过继承rpc.RemoteObject来创建自定义的实现类。

Service侧把自身的实例返回给调用侧的代码示例如下:

  1. import rpc from "@ohos.rpc";
  2. var mMyStub;
  3. export default {
  4. onStart(want) {
  5. class MyStub extends rpc.RemoteObject{
  6. constructor(des) {
  7. if (typeof des === 'string') {
  8. super(des);
  9. }
  10. return null;
  11. }
  12. onRemoteRequest(code, message, reply, option) {
  13. }
  14. }
  15. mMyStub = new MyStub("ServiceAbility-test");
  16. },
  17. onCommand(want, restart, startId) {
  18. console.log('SerivceAbility onCommand');
  19. },
  20. onConnect(want) {
  21. console.log('SerivceAbility OnConnect');
  22. return mMyStub;
  23. },
  24. onDisconnect() {
  25. console.log('SerivceAbility OnDisConnect');
  26. },
  27. onStop() {
  28. console.log('SerivceAbility onStop');
  29. },
  30. }