HarmonyOs

Ability

ability 解释为能力,在HarmonyOs当中意味着应用有什么能力(用户交互,应用的哪些功能都是能力)

ability又分为了两种 FA(Feature Ability)和 PA(Particle Ability)两种类型 ,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。

Feature Ability

FA(Feature Ability),中文意思是功能能力,它支持Page Ability 页面能力用于提供与用户交互的能力。一个Page 可以由一个或多个 AbilitySlice 构成,AbilitySlice 是指应用的单个页面及其控制逻辑的总和。

在这里插入图片描述

在这里插入图片描述
一个 Page 可以包含多个 AbilitySlice,但是 Page 进入前台时界面默认只展示一个AbilitySlice。默认展示的 AbilitySlice 是通过 setMainRoute() 方法来指定的。如果需要更改默认展示的 AbilitySlice,可以通过 addActionRoute() 方法为此 AbilitySlice 配置一条路由规则。此时,当其他 Page 实例期望导航到此 AbilitySlice 时,可以在 Intent 中指定 Action。addActionRoute() 方法中使用的动作命名,需要在应用配置文件(config.json)中注册:
比如:
在这里插入图片描述

Particle Ability

​ PA(Particle Ability),这个里面也是支持两个能力, Service Ability 和 Data Ability 我相信你知道它们的意思,就是服务能力和数据能力。Service用于提供后台运行任务的能力。Data 用于对外部提供统一的数据访问抽象。在配置文件(config.json)中注册 Ability 时,可以通过配置 Ability 元素中的“type”属性来指定 Ability 模板类型,示例如下。其中,“type”的取值可以为“page”、“service”或“data”,分别代表 Page 模板、Service 模板、Data 模板。结合下面这个图来看知道是怎么回事了,type的属性值取决于你创建Ability是选择的类型,当然你也可以后面再改。

Page Ability讲解(生命周期)

现在我们知道这个Page Ability是主要负责页面交互的,那么就可以理解为Android 的Activity。那么都知道Activity有生命周期,同样的Page Ability也是的。下面来看看它的生命周期。

在这里插入图片描述

声明周期分别是onStart()、onActive()、onInactive()、onBackground()、onForeground()、onStop()

onStart()

​ 启动状态

​ onStart() 当系统首次创建 Page Ability实例时,触发该回调。对于一个 Page Ability实例,该回调在其生命周期过程中仅触发一次,Page Ability在该逻辑后将进入 INACTIVE 状态。开发者必须重写该方法,并在此配置默认展示的 AbilitySlice。

​ 如图所示:

在这里插入图片描述

和onCreate有点像。

onActive()

​ 应用与用户交互的状态

​ Page Ability会在进入 INACTIVE 状态后来到前台,然后系统调用此回调。Page Ability 在此之后进入ACTIVE 状态,该状态是应用与用户交互的状态。Page Ability将保持在此状态,除非某类事件发生导致 Page Ability失去焦点,比如用户点击返回键或导航到其他 Page Ability。当此类事件发生时,会触发Page Ability回到 INACTIVE 状态,系统将调用 onInactive() 回调。此后,Page Ability可能重新回到ACTIVE 状态,系统将再次调用 onActive() 回调。因此,开发者通常需要成对实现 onActive() 和 onInactive(),并在 onActive() 中获取在 onInactive() 中被释放的资源。类似于Android的onResume。

onInactive()

​ 暂停状态

当 Page Ability失去焦点时,系统将调用此回调,此后 Page 进入 INACTIVE 状态。开发者可以在此回调中实现 Page 失去焦点时应表现的恰当行为。

onBackground ()

​ 不再对用户可见

​ 意味着某些界面是用户看不见的。如:资源释放等。

onForeground()

​ 通知状态,界面切换通知。

onStop()

​ 销毁状态

系统将要销毁 Page Ability时,将会触发此回调函数,通知用户进行系统资源的释放。销毁 Page 的可能原因包括以下几个方面:
▪ 用户通过系统管理能力关闭指定 Page Ability,例如使用任务管理器关闭 Page Ability。
▪ 用户行为触发 Page Ability的 terminateAbility()方法调用,例如使用应用的退出功能。
▪ 配置变更导致系统暂时销毁 Page Ability并重建。
▪ 系统出于资源管理目的,自动触发对处于 BACKGROUND 状态 Page Ability的销毁。

MainAbility & MainAbilitySlice 关系

在这里插入图片描述

两者是一个组成单元

​ AbilitySlice 作为 Page Ability的组成单元,其生命周期是依托于其所属 Page Ability生命周期的。AbilitySlice 和 Page Ability具有相同的生命周期状态和同名的回调,当 Page Ability生命周期发生变化时,它的 AbilitySlice 也会发生相同的生命周期变化。此外,AbilitySlice 还具有独立于 Page Ability的生命周期变化,这发生在同一 Page Ability中的 AbilitySlice 之间导航时,此时 Page Ability的生命周期状态不会改变。

AbilitySlice是设置布局的
在这里插入图片描述

ServiceAbility讲解(生命周期)

serviceAbility为后台服务的能力

创建一个servicebility
在这里插入图片描述
在这里插入图片描述

这里的Enable background mode() 允许后台运行哪些服务

上面的这个Visible你如果勾选上就是你的这个Service对其他应用程序可见,而Enable background mode表示后台模式,如果你打开这个开关,就表示你的Service要在后台运行,还可以自己选择你要在后台干嘛。
在这里插入图片描述
在这里插入图片描述

这里你就必须要选一个,不选就不能创建这个Service Ability。下面我们就直接创建,不勾选,不打开。创建Service Ability不会生成AbilitySlice。
在这里插入图片描述

这个时候在config.json文件中会自动生成相关的属性
在这里插入图片描述

可以看到相比于Page ,Service的属性要少一些,而且type的属性值是“service”。

ServiceAbility生命周期
onStart()

初始化时侯调用(启动),在整个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
DeviceId

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

BundleName

表示包名称

AbilityName

表示待启动的 Ability 名称。

本地实例
	/**
     * 启动本地服务
     */
    private void startupLocalService() {
        Intent intent = new Intent();
        //构建操作方式
        Operation operation = new Intent.OperationBuilder()
                // 设备id
                .withDeviceId("")
                // 应用的包名
                .withBundleName("com.example.harmonyos")
                // 跳转目标的路径名  通常是包名+类名
                .withAbilityName("com.example.harmonyos.PhoneServiceAbility")
                .build();
        //设置操作
        intent.setOperation(operation);
        startAbility(intent); //启动实例
    }

远程实例
	private void startupRemotelyService() {
        Intent intent = new Intent();
        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.setOperation(operation);
        startAbility(intent);
    }

在这里插入图片描述

停止(销毁)实例

在这里插入图片描述

ServiceAbility实例停止过程

当我们从其他的Page Ability中停止Service时,会先回调onBackground。因为这个时候服务是在前台运行的,系统会把服务放到后台,然后再通过stop来停止这个服务。

Successful !!!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐