HarmonyOS鸿蒙Next之Ability03——一个HarmonyOS Service Ability生命周期的例子
HarmonyOS鸿蒙Next之Ability03——一个HarmonyOS Service Ability生命周期的例子 为了更好理解Service Ability的生命周期,我们将用一个示例来演示。采用Car设备类型,创建一个名为ServiceAbilityLifeCycle的应用。
5.8.1 创建Service
在DevEco Studio中,可以如下图所示的方式方便创建一个Empty Service Ability。
根据如图所示的引导,我们创建了一个名为TimeServiceAbility的Service。
注意,上述步骤中的“Enable backgroud mode”(后台模式)先不要启用。
在自动创建的TimeServiceAbility的基础上,修改代码如下:
package com.waylau.hmos.serviceabilitylifecycle;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.rpc.IRemoteObject;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.time.LocalDateTime;
public class TimeServiceAbility extends Ability {
private static final HiLogLabel LOG_LABEL =
new HiLogLabel(HiLog.LOG_APP, 0x00001, "TimeServiceAbility");
private TimeRemoteObject timeRemoteObject = new TimeRemoteObject();
@Override
public void onStart(Intent intent) {
HiLog.info(LOG_LABEL, "onStart");
super.onStart(intent);
}
@Override
public void onBackground() {
super.onBackground();
HiLog.info(LOG_LABEL, "onBackground");
}
@Override
public void onStop() {
super.onStop();
HiLog.info(LOG_LABEL, "onStop");
}
@Override
public void onCommand(Intent intent, boolean restart, int startId) {
super.onCommand(intent, restart, startId);
HiLog.info(LOG_LABEL, "onCommand");
}
@Override
public IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
HiLog.info(LOG_LABEL, "onConnect");
LocalDateTime now = LocalDateTime.now();
timeRemoteObject.setTime(now);
return timeRemoteObject;
}
@Override
public void onDisconnect(Intent intent) {
super.onDisconnect(intent);
HiLog.info(LOG_LABEL, "onDisconnect");
}
}
其中,timeRemoteObject是一个IRemoteObject子类的实例,可以通过timeRemoteObject将当前时间返回给调用侧。
同时在配置文件中会自动新增了TimeServiceAbility相关的配置信息。
"abilities": [
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"orientation": "landscape",
"name": "com.waylau.hmos.serviceabilitylifecycle.MainAbility",
"icon": "$media:icon",
"description": "$string:mainability_description",
"label": "ServiceAbilityLifeCycle",
"type": "page",
"launchType": "standard"
},
// 新增的TimeServiceAbility
{
"name": "com.waylau.hmos.serviceabilitylifecycle.TimeServiceAbility",
"icon": "$media:icon",
"description": "$string:timeserviceability_description",
"type": "service"
}
]
5.8.2 创建远程对象
timeRemoteObject是TimeRemoteObject类的实例。TimeRemoteObject类是远程对象,继承自LocalRemoteObject,代码如下:
package com.waylau.hmos.serviceabilitylifecycle;
import ohos.aafwk.ability.LocalRemoteObject;
import java.time.LocalDateTime;
public class TimeRemoteObject extends LocalRemoteObject {
private LocalDateTime time;
public TimeRemoteObject() {}
public void setTime(LocalDateTime time) {
this.time = time;
}
public LocalDateTime getTime() {
return time;
}
}
其中,itme属性是为了返回给调用方的服务器当前时间。
5.8.3 修改MainAbilitySlice
修改MainAbilitySlice代码如下:
package com.waylau.hmos.serviceabilitylifecycle.slice;
import com.waylau.hmos.serviceabilitylifecycle.ResourceTable;
import com.waylau.hmos.serviceabilitylifecycle.TimeRemoteObject;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.ability.IAbilityConnection;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Text;
import ohos.bundle.ElementName;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.rpc.IRemoteObject;
import java.time.LocalDateTime;
public class MainAbilitySlice extends AbilitySlice {
private static final HiLogLabel LOG_LABEL =
new HiLogLabel(HiLog.LOG_APP, 0x00001, "MainAbilitySlice");
private TimeRemoteObject timeRemoteObject;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
// 添加点击事件
Text textStart = (Text) findComponentById(ResourceTable.Id_text_start);
textStart.setClickedListener(listener -> {
// 启动本地服务
startupLocalService(intent);
// 连接本地服务
connectLocalService(intent);
});
// 添加点击事件
Text textStop = (Text) findComponentById(ResourceTable.Id_text_stop);
textStop.setClickedListener(listener -> {
// 断开本地服务
disconnectLocalService(intent);
// 关闭本地服务
stopLocalService(intent);
});
HiLog.info(LOG_LABEL, "onStart");
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
/**
* 启动本地服务
*/
private void startupLocalService(Intent intent) {
// 构建操作方式
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.waylau.hmos.serviceabilitylifecycle")
.withAbilityName("com.waylau.hmos.serviceabilitylifecycle.TimeServiceAbility")
.build();
// 设置操作
intent.setOperation(operation);
startAbility(intent);
HiLog.info(LOG_LABEL, "startupLocalService");
}
/**
* 关闭本地服务
*/
private void stopLocalService(Intent intent) {
stopAbility(intent);
HiLog.info(LOG_LABEL, "stopLocalService");
}
// 创建连接回调实例
private IAbilityConnection connection = new IAbilityConnection() {
// 连接到Service的回调
@Override
public void onAbilityConnectDone(ElementName elementName,
IRemoteObject iRemoteObject, int resultCode) {
// Client侧需要定义与Service侧相同的IRemoteObject实现类。
// 开发者获取服务端传过来IRemoteObject对象,并从中解析出服务端传过来的信息。
timeRemoteObject = (TimeRemoteObject) iRemoteObject;
HiLog.info(LOG_LABEL, "onAbilityConnectDone, time: %{public}s",
timeRemoteObject.getTime());
}
// 断开与连接的回调
@Override
public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
HiLog.info(LOG_LABEL, "onAbilityDisconnectDone");
}
};
/**
* 连接本地服务
*/
private void connectLocalService(Intent intent) {
// 连接Service
connectAbility(intent, connection);
HiLog.info(LOG_LABEL, "connectLocalService");
}
/**
* 断开连接本地服务
*/
private void disconnectLocalService(Intent intent) {
// 断开连接Service
disconnectAbility(connection);
HiLog.info(LOG_LABEL, "disconnectLocalService");
}
}
上述代码,在onStart()方法中,增加了对Text的事件监听。当点击textStart时,会启动本地服务、连接本地服务;当点击textEnd时,会断开本地服务、关闭本地服务。
5.8.4 修改ability_main.xml
修改ability_main.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Text
ohos:id="$+id:text_start"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="Start"
ohos:text_size="50"
/>
<Text
ohos:id="$+id:text_stop"
ohos:height="match_parent"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="End"
ohos:text_size="50"
/>
</DirectionalLayout>
上述代码,主要是定义了两个Text,一个用于触发Start点击事件,一个用于触发End点击事件。
5.8.5 运行
将应用在Car模拟器中进行运行,如下图所示。
此时,能看到控制台输出如下内容:
12-26 22:23:13.496 28370-28370/? I 00001/MainAbilitySlice: onStart
从上述日志可以看出,MainAbilitySlice已经启动。
点击文本“Start”后,触发了点击事件,此时,能看到控制台输出如下内容:
12-26 22:24:15.739 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/MainAbilitySlice: startupLocalService
12-26 22:24:15.745 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/MainAbilitySlice: connectLocalService
12-26 22:24:15.748 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onStart
12-26 22:24:15.750 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onCommand
12-26 22:24:15.764 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onConnect
12-26 22:24:15.771 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/MainAbilitySlice: onAbilityConnectDone, time: 2020-12-26T22:24:15.769
当点击文本“Start”时,会启动本地服务、连接本地服务。而TimeServiceAbility也分别执行了onStart、onCommand以及onConnect等生命周期,并将当前时间返回给了MainAbilitySlice。
点击文本“End”后,触发了点击事件,此时,能看到控制台输出如下内容:
12-26 22:26:27.502 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/MainAbilitySlice: disconnectLocalService
12-26 22:26:27.505 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/MainAbilitySlice: stopLocalService
12-26 22:26:27.508 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onDisconnect
12-26 22:26:27.513 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onBackground
12-26 22:26:27.513 28370-28370/com.waylau.hmos.serviceabilitylifecycle I 00001/TimeServiceAbility: onStop
当点击文本“Start”时,会断开本地服务、关闭本地服务。而TimeServiceAbility也分别执行了onDisconnect、onBackground以及onStop等生命周期。
5.8.3中,启动本地服务
startAbility(intent);
这行没理解,整个程序中没找到其他有 startAbility
地方,这是鸿蒙OS原生的函数吗?
包括后面的 stop, connect, disconnect
更多关于HarmonyOS鸿蒙Next之Ability03——一个HarmonyOS Service Ability生命周期的例子的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在基类 Ability
中。
谢谢,对新手来说,这就是个大黑洞,
哈哈,没事,坚持编码即可,
请问TimeRemoteObject类在哪里创建?
5.8.2 创建远程对象,
创建远程对象,
在HarmonyOS中,Service Ability的生命周期包括以下几个关键阶段:
- onStart():当Service Ability被创建时调用,用于初始化资源。
- onCommand():当客户端通过
startAbility()
或startAbilityForResult()
启动Service时调用,用于处理具体业务逻辑。 - onConnect():当客户端通过
connectAbility()
连接Service时调用,返回一个IRemoteObject
用于跨进程通信。 - onDisconnect():当客户端断开连接时调用,用于释放相关资源。
- onStop():当Service被销毁时调用,用于清理资源。
开发者可以根据业务需求在这些生命周期方法中实现相应的逻辑。