核心应用组件系列:后台服务

类似于Android四大组件中的Service

type
status
date
slug
summary
tags
category
icon
password
OpenHarmony中,后台服务能力由ServiceExtensionAbility提供;ServiceExtensionAbility支持以启动和连接两种形式运行。
启动和连接后台服务的差别:
  • 启动:AbilityA启动ServiceB,启动后AbilityA和ServiceB为弱关联,AbilityA退出后,ServiceB可以继续存在。
  • 连接:AbilityA绑定ServiceB,绑定后AbilityA和ServiceB为强关联,AbilityA退出后,ServiceB也一起退出。
系统应用和三方应用的差别:
 
本文描述中称被启动的ServiceExtensionAbility为服务端,称启动ServiceExtensionAbility的组件为客户端。本章节将从如下场景来介绍ServiceExtensionAbility的基本使用。
说明:
  1. OpenHarmony当前不支持三方应用实现ServiceExtensionAbility。如果三方开发者想要实现后台处理相关事务的功能,可以使用后台任务,具体请参见后台任务
  1. 三方应用的UIAbility组件可以通过Context连接系统提供的ServiceExtensionAbility。
  1. 三方应用需要在前台获焦的情况下才能连接系统提供的ServiceExtensionAbility。
  1. 每个类型的ExtensionAbility都有自己的Context,ServiceExtensionAbility通过ServiceExtensionContext提供相关能力。

实现一个后台服务(Server,仅对系统应用开放)

ServiceExtensionAbility提供了onCreate()、onRequest()、onConnect()、onDisconnect()和onDestory()生命周期回调,根据需要重写对应的回调方法。下图展示了ServiceExtensionAbility的生命周期。
 
notion image
图1 ServiceExtensionAbility生命周期
 
  • onCreate 服务被首次创建时触发该回调,开发者可以在此进行一些初始化的操作,例如注册公共事件监听等。
    • 说明: 如果服务已创建,再次启动该ServiceExtensionAbility不会触发onCreate()回调。
  • onRequest 当另一个组件调用startServiceExtensionAbility()方法启动该服务组件时,触发该回调。执行此方法后,服务会启动并在后台运行。
  • onConnect 当另一个组件调用connectServiceExtensionAbility()方法与该服务连接时,触发该回调。开发者在此方法中,返回一个远端代理对象(IRemoteObject),客户端拿到这个对象后可以通过这个对象与服务端进行RPC通信。
  • onDisconnect 其他组件调用disconnectServiceExtensionAbility()方法时,如果没有任何其他组件连接该服务,触发该回调。
  • onDestroy 当不再使用服务且准备将其销毁该实例时,触发该回调。开发者可以在该回调中清理资源,如注销监听等。

开发步骤

开发者在实现一个后台服务时,需要在DevEco Studio工程中手动新建一个ServiceExtensionAbility,具体步骤如下。
  1. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为serviceextability。
  1. 在serviceextability目录,右键选择“New > TypeScript File”,新建一个TypeScript文件并命名为ServiceExtAbility.ts。
  1. 打开ServiceExtAbility.ts文件,导入RPC通信模块,重载onRemoteMessageRequest()方法,接收客户端传递过来的消息,并将处理的结果返回给客户端。REQUEST_VALUE用于校验客户端发送的服务请求码。
    1. 在ServiceExtAbility.ts文件中,增加导入ServiceExtensionAbility的依赖包,自定义类继承ServiceExtensionAbility并加上需要的生命周期回调。
      1. 在工程Module对应的module.json5配置文件中注册ServiceExtensionAbility,type标签需要设置为“service”,srcEntrance标签表示当前ExtensionAbility组件所对应的代码路径。

        启动一个后台服务(Client,仅对系统应用开放)

        系统应用通过startServiceExtensionAbility()方法启动一个后台服务,服务的onRequest()回调就会被调用,并在该回调方法中接收到调用者传递过来的want对象。后台服务启动后,其生命周期独立于客户端,即使客户端已经销毁,该后台服务仍可继续运行。因此,后台服务需要在其工作完成时通过调用ServiceExtensionContext的terminateSelf()来自行停止,或者由另一个组件调用stopServiceExtensionAbility()来将其停止。
        说明: ServiceExtensionContext的startServiceExtensionAbility()、stopServiceExtensionAbility()和terminateSelf()为系统接口,三方应用不支持调用。
        1. 在系统应用中启动一个新的ServiceExtensionAbility。示例中的context的获取方式请参见获取UIAbility的上下文信息
          1. 在系统应用中停止一个已启动的ServiceExtensionAbility。
            1. 已启动的ServiceExtensionAbility停止自身。
              说明: 后台服务可以在后台长期运行,为了避免资源浪费,需要对后台服务的生命周期进行管理。即一个后台服务完成了请求方的任务,需要及时销毁。销毁已启动的后台服务有两种方式:
              调用terminateSelf()stopServiceExtensionAbility()方法之后,系统将销毁后台服务。

              连接一个后台服务(Client)

              系统应用或者三方应用可以通过connectServiceExtensionAbility()连接一个服务(在Want对象中指定启动的目标服务),服务的onConnect()就会被调用,并在该回调方法中接收到调用者传递过来的Want对象,从而建立长连接。
              ServiceExtensionAbility服务组件在onConnect()中返回IRemoteObject对象,开发者通过该IRemoteObject定义通信接口,用于客户端与服务端进行RPC交互。多个客户端可以同时连接到同一个后台服务,客户端完成与服务的交互后,客户端需要通过调用disconnectServiceExtensionAbility()来断开连接。如果所有连接到某个后台服务的客户端均已断开连接,则系统会销毁该服务。
              • 使用disconnectServiceExtensionAbility()断开与后台服务的连接。

                相关示例

                针对ServiceExtensionAbility开发,有以下相关示例可供参考: