购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.7 Service Ability

基于Service模板的Ability简称为Service,其主要用于后台运行任务,比如执行音乐播放、文件下载等,但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。

Service是单实例的。在一个设备上,相同的Service只会存在一个实例。如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出。由于Service是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service中创建新的线程来处理,防止造成主线程阻塞,应用程序无响应。

有关线程方面的内容详见第12章。

5.7.1 创建Service

接下来介绍如何创建一个Service。

1.继承Ability

每个Service都是Ability的子类,需要实现Service相关的生命周期方法。

Ability为Service提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理。

· onStart():该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。该方法在前面章节的Page中已经做了介绍。

· 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应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。该方法在前面章节的Page中已经做了介绍。

创建Service的示例代码如下:

2.注册Service

Service也需要在应用配置文件中进行注册,注册类型type需要设置为service。配置内容如下:

5.7.2 启动Service

接下来介绍通过startAbility()启动Service以及对应的停止方法。

1.启动Service

Ability为开发者提供了startAbility()方法来启动另一个Ability。因为Service也是Ability的一种,开发者同样可以通过将Intent传递给该方法来启动Service,不仅支持启动本地Service,还支持启动远程Service。

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

· DeviceId:表示设备ID。如果是本地设备,则可以直接留空;如果是远程设备,则可以通过ohos.distributedschedule.interwork.DeviceManager提供的getDeviceList获取设备列表。

· BundleName:表示包名称。

· AbilityName:表示待启动的Ability名称。

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

执行上述代码后,Ability将通过startAbility()方法来启动Service。

· 如果Service尚未运行,则系统会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。

· 如果Service正在运行,则系统会直接回调Service的onCommand()方法来启动Service。

2.停止Service

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

停止Service同样支持停止本地设备Service和停止远程设备Service,使用方法与启动Service一样。一旦调用停止Service的方法,系统便会尽快销毁Service。

5.7.3 连接Service

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

在使用connectAbility()处理回调时,需要传入目标Service的Intent与IAbilityConnection的实例。IAbilityConnection提供了两个方法供开发者实现:

· onAbilityConnectDone()用来处理连接的回调。

· onAbilityDisconnectDone()用来处理断开连接的回调。

连接Service的代码示例如下:

同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象,HarmonyOS提供了IRemoteObject的默认实现,用户可以通过继承LocalRemoteObject来创建自定义的实现类。Service侧把自身的实例返回给调用侧的示例代码如下:

5.7.4 Service Ability的生命周期

与Page类似,Service也拥有生命周期,如图5-15所示。

根据调用方法的不同,其生命周期有以下两种路径:

· 启动Service:该Service在其他Ability调用startAbility()时创建,然后保持运行。其他Ability通过调用stopAbility()来停止Service,Service停止后,系统会将其销毁。

· 连接Service:该Service在其他Ability调用connectAbility()时创建,客户端可通过调用disconnectAbility()断开连接。多个客户端可以绑定到相同的Service,而且当所有绑定全部取消后,系统就会销毁该Service。connectAbility()也可以连接通过startAbility()创建的Service。

图5-15 Service Ability的生命周期 d3EAzrCko475KB0VVuTAQ/KhZHZGadWkjz1vm37uWYGqyAMiY1ni6L7+OwTgqS5d

点击中间区域
呼出菜单
上一章
目录
下一章
×