20、鸿蒙OS Service模板的Ability基本概念,怎么创建Service、启动Service
- 作者: 奔跑的二大爷S
- 来源: 51数据库
- 2022-10-14
基于 Service 模板的 Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service 可由其他应用或 Ability 启动,即使用户切换到其他应用,Service 仍将在后台继续运行。
Service 是单实例的。在一个设备上,相同的 Service 只会存在一个实例。如果多个 Ability 共用这个实例,只有当与 Service 绑定的所有 Ability 都退出后,Service 才能够退出。由于 Service 是在主线程里执行的,因此,如果在 Service 里面的操作时间过长,开发者必须在 Service 里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应。
介绍如何创建一个Service。
创建 Ability 的子类,实现 Service 相关的生命周期方法。Service 也是一种 Ability,Ability 为 Service 提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理。
onStart()
该方法在创建 Service 的时候调用,用于 Service 的初始化,在 Service 的整个生命周期只会调用一次。
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 的代码示例如下:
public class ServiceAbility extends Ability { @Override public void onStart(Intent intent) { super.onStart(intent); } @Override public void onCommand(Intent intent, boolean restart, int startId) { super.onCommand(intent, restart, startId); } @Override public IRemoteObject onConnect(Intent intent) { super.onConnect(intent); return null; } @Override public void onDisconnect(Intent intent) { super.onDisconnect(intent); } @Override public void onStop() { super.onStop(); } }
注册 Service。
Service 也需要在应用配置文件中进行注册,注册类型 type 需要设置为 service。
{ "module": { "abilities": [ { "name": ".ServiceAbility", "type": "service", "visible": true ... } ] ... } ... }xxxxxxxxxx { "module": { "abilities": [ { "name": ".ServiceAbility", "type": "service", "visible": true ... } ] ... } ...}{ "module": { "abilities": [ { "name": ".ServiceAbility", "type": "service", "visible": true ... } ] ... } ...}
介绍通过startAbility()启动Service以及对应的停止方法。
启动Service
Ability为开发者提供了 startAbility() 方法来启动另外一个 Ability。因为Service也是 Ability 的一种,开发者同样可以通过将 Intent 传递给该方法来启动 Service。不仅支持启动本地 Service,还支持启动远程 Service。
开发者可以通过构造包含 DeviceId、BundleName 与 AbilityName 的 Operation 对象来设置目标 Service 信息。这三个参数的含义如下:
DeviceId:表示设备 ID。如果是本地设备,则可以直接留空;如果是远程设备,可以通过 ohos.distributedschedule.interwork.DeviceManager 提供的 getDeviceList 获取设备列表,详见《 API 参考》。
BundleName:表示包名称。
AbilityName:表示待启动的 Ability 名称。
启动本地设备 Service 的代码示例如下:
Intent intent = new Intent(); Operation operation = new Intent.OperationBuilder() .withDeviceId("") .withBundleName("com.huawei.hiworld.himusic") .withAbilityName("com.huawei.hiworld.himusic.entry.ServiceAbility") .build(); intent.setOperation(operation); startAbility(intent);
启动远程设备 Service 的代码示例如下:
Operation operation = new Intent.OperationBuilder() .withDeviceId("deviceId") .withBundleName("com.huawei.hiworld.himusic") .withAbilityName("com.huawei.hiworld.himusic.entry.ServiceAbility") .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) // 设置支持分布式调度系统多设备启动的标识 .build(); Intent intent = new Intent(); intent.setOperation(operation); startAbility(intent);
执行上述代码后,Ability 将通过 startAbility() 方法来启动 Service。
如果 Service 尚未运行,则系统会先调用 onStart()来初始化 Service,再回调 Service 的 onCommand() 方法来启动 Service。
如果 Service 正在运行,则系统会直接回调 Service 的 onCommand() 方法来启动 Service。
停止 Service
Service 一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁 Service。开发者可以在 Service 中通过 terminateAbility() 停止本 Service 或在其他 Ability 调用 stopAbility() 来停止 Service。
停止 Service 同样支持停止本地设备 Service 和停止远程设备 Service,使用方法与启动 Service 一样。一旦调用停止 Service 的方法,系统便会尽快销毁 Service。