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。

创建一个Empty Service Ability

根据如图所示的引导,我们创建了一个名为TimeServiceAbility的Service。

创建了一个TimeServiceAbility

注意,上述步骤中的“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模拟器中进行运行,如下图所示。

在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等生命周期。

7 回复

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的生命周期包括以下几个关键阶段:

  1. onStart():当Service Ability被创建时调用,用于初始化资源。
  2. onCommand():当客户端通过startAbility()startAbilityForResult()启动Service时调用,用于处理具体业务逻辑。
  3. onConnect():当客户端通过connectAbility()连接Service时调用,返回一个IRemoteObject用于跨进程通信。
  4. onDisconnect():当客户端断开连接时调用,用于释放相关资源。
  5. onStop():当Service被销毁时调用,用于清理资源。

开发者可以根据业务需求在这些生命周期方法中实现相应的逻辑。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!