HarmonyOS鸿蒙Next之Ability02——理解HarmonyOS鸿蒙Next Service Ability
HarmonyOS鸿蒙Next之Ability02——理解HarmonyOS鸿蒙Next Service Ability 基于Service模板的Ability,简称为Service,其职责主要用于后台运行任务,比如执行音乐播放、文件下载等等,但不提供用户交互界面。
Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。
Service是单实例的。在一个设备上,相同的Service只会存在一个实例。如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出。由于Service是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service里创建新的线程来处理,防止造成主线程阻塞,应用程序无响应。
有关线程方面的内容,可以详见我之前的博客。
5.7.1 创建Service
接下来介绍如何创建一个Service。
1. 继承Ability
每个Service也都是Ability的子类,需要实现Service相关的生命周期方法。
Ability为Service提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理。
-
onStart()
:该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。该方法在前面章节的Page中已经做了介绍。 -
onCommand()
:在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。 -
onConnect()
:在Ability和服务连接时调用,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect
方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect
方法。 -
onDisconnect()
:在Ability与绑定的Service断开连接时调用。 -
onStop()
:在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。该方法在前面章节的Page中已经做了介绍。
创建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();
}
}
2. 注册Service
Service也需要在应用配置文件中进行注册,注册类型type需要设置为service。配置内容如下:
{
"module": {
"abilities": [
{
"name": ".ServiceAbility",
"type": "service",
"visible": true
...
}
]
...
}
}
5.7.2 启动Service
接下来介绍通过startAbility()
启动Service以及对应的停止方法。
1. 启动Service
Ability为开发者提供了startAbility()
方法来启动另外一个Ability。因为Service也是Ability的一种,开发者同样可以通过将Intent传递给该方法来启动Service。不仅支持启动本地Service,还支持启动远程Service。
开发者可以通过构造包含DeviceId、BundleName与AbilityName的Operation对象来设置目标Service信息。这三个参数的含义如下:
-
DeviceId:表示设备ID。如果是本地设备,则可以直接留空;如果是远程设备,可以通过
ohos.distributedschedule.interwork.DeviceManager
提供的getDeviceList
获取设备列表。 -
BundleName:表示包名称。
-
AbilityName:表示待启动的Ability名称。
启动本地设备Service的代码示例如下:
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.huawei.hiworld.himusic")
.withAbilityName("com.huawei.hiworld.himusic.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.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。
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的代码示例如下:
// 创建连接回调实例
private IAbilityConnection connection = new IAbilityConnection() {
// 连接到Service的回调
@Override
public void onAbilityConnectDone(ElementName elementName,
IRemoteObject iRemoteObject, int resultCode) {
// Client侧需要定义与Service侧相同的IRemoteObject实现类。
// 开发者获取服务端传过来IRemoteObject对象,并从中解析出服务端传过来的信息。
}
// 断开与连接的回调
@Override
public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
}
};
// 连接Service
connectAbility(intent, connection);
同时,Service侧也需要在onConnect()
时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()
需要返回一个IRemoteObject对象,HarmonyOS提供了IRemoteObject的默认实现,用户可以通过继承LocalRemoteObject来创建自定义的实现类。Service侧把自身的实例返回给调用侧的代码示例如下:
// 创建自定义IRemoteObject实现类
private class MyRemoteObject extends LocalRemoteObject {
public MyRemoteObject() {
super("MyRemoteObject");
}
}
// 把IRemoteObject返回给客户端
@Override
protected IRemoteObject onConnect(Intent intent) {
return new MyRemoteObject();
}
5.7.4 Service Ability生命周期
与Page类似,Service也拥有生命周期,如图5-15所示。
根据调用方法的不同,其生命周期有以下两种路径:
- 启动Service:该Service在其他Ability调用
startAbility()
时创建,然后保持运行。其他Ability通过调用stopAbility()
来停止Service,Service停止后,系统会将其销毁。 - 连接Service:该Service在其他Ability调用
connectAbility()
时创建,客户端可通过调用disconnectAbility()
断开连接。多个客户端可以绑定到相同Service,而且当所有绑定全部取消后,系统即会销毁该Service。
更多关于HarmonyOS鸿蒙Next之Ability02——理解HarmonyOS鸿蒙Next Service Ability的实战教程也可以访问 https://www.itying.com/category-93-b0.html
不错。。。。。。。
更多关于HarmonyOS鸿蒙Next之Ability02——理解HarmonyOS鸿蒙Next Service Ability的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是FA模型下的概念吧,Stage模型下还有ServiceAbility?
是的哦,
基本信息
这是深色代码主题
这是一段正常的文本。
有一个问题:其他的Ability连接了Service之后,通过IPC通道发送给Service的消息,Service是在哪里处理的呢?或者说Service的哪一个回调函数会被调用? 楼主能否提点一下
命令信息
- 名称: onCommand()
- 描述:
- 类型: Function
- 参数:
command
(string): 命令字符串args
(array): 参数数组
- 返回值:
boolean
: 指示命令是否成功执行
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
多分享些内容吧
果然有说道呀
感谢楼主提点呀
在HarmonyOS鸿蒙Next中,Service Ability是一种后台服务组件,用于执行长时间运行的任务或处理跨应用的数据交互。它不依赖于UI,可以在应用退出后继续运行。Service Ability通过startAbility()
或connectAbility()
启动,支持跨进程通信。开发者需在config.json
中声明Service Ability,并实现onStart()
、onCommand()
等方法处理任务。Service Ability适用于音乐播放、文件下载等场景,确保任务在后台持续执行。