鸿蒙应用开发培训笔记03:Ability 设计与开发

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鸿蒙应用开发培训笔记03:Ability 设计与开发相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. Ability和AbilitySlice的概念
  2. 理解FA (Feature Ability)和PA (Particle Ability)
  3. 理解Page Ability、Service Ability与Data Ability的关系

一、Ability 是什么?

(一)Ability概念

Ability是应用所具备能力的抽象,也是应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability),HarmonyOS支持应用以Ability为单位进行部署。Ability可以分为FA (Feature Ability) 和PA (Particle Ability) 两种类型,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。

(二)Ability分类

Ability可以分为Feature Ability(简称FA)和Particle Ability(简称PA)两种类型。

  • FA支持Page模板,用于提供与用户交互的能力。
  • PA支持Service模板和Data模板,Service用于提供后台运行任务的能力,Data用于对外部提供统一的数据访问抽象。

二、Ability 开发案例

(一)开发需求

在“小鸿网课”应用中,需要实现这样的需求:单设备播放教学视频并能答题,切换到多设备协同模式时,使用大屏设备播放教学视频,使用手持设备答题。

这一需求可以通过使用PageAbility、AbilitySlice和Intent实现。PageAbility和AbilitySlice用于构建页面,Intent用于实现页面跨设备唤起。该需求的流程图如下:

(二)开发方案

  • 构建Page Ability,并添加两个AbilitySlice,分别用于展示本地端和远程端页面。
  • 获取远程端的DeviceID(设备ID)后,通过Intent根据DeviceID在指定设备上启动远程端Page。

(三)案例涉及知识点

  1. PageAbility和AbilitySlice,以及它们的生命周期回调方法
  2. Intent,以及如何使用它来实现页面跳转
  3. Service Ability,主要用于后台运行任务
  4. Data Ability,用于对外提供打开文件、操作数据等接口

三、Page Ability 和 AbilitySlice

  • Page模板(以下简称 “Page”)是Feature Ability唯一支持的模板,用于提供与用户交互的能力。
  • 一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和。
  • 不同Page之间可以跳转,并可以指定跳转到目标Page中某个具体的AbilitySlice。

四、页面生命周期

(一)生命周期状态

当用户进入、浏览、退出页面时,页面将有不同的状态,并回调不同的生命周期状态方法给外界。

(二)生命周期回调方法示意图

Page Ability和AbilitySlice具有相似的生命周期回调方法,如下图所示:

(三)生命周期回调方法详解

1、onStart()回调方法

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

2、onActive()回调方法

  • Page会在进入INACTIVE状态后来到前台,然后系统调用此回调
  • Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态
  • Page将保持在此状态,除非某类事件发生导致Page失去焦点,比如用户点击返回键或导航到其他Page。

3、onInactive()回调方法

  • Page失去焦点时,系统将调用此回调,此后Page进入INACTIVE状态
  • 开发者可在此回调中执行Page失去焦点时要执行的操作

4、onBackground()回调方法

  • Page不再对用户可见,系统将调用此回调。此回调通知开发者进行相应的资源释放,此后Page进入BACKGROUND状态
  • 开发者在此回调中应释放Page不可见时无用的资源,或执行较为耗时的状态保存操作

5、onStop()回调方法

  • 系统将要销毁Page时,会触发此回调函数。此回调通知开发者进行系统资源的释放。

6、onForeground()回调方法

  • 处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此Page),系统将调用此回调
  • 在此之后Page的生命周期状态回到INACTIVE状态
  • 开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,系统将通过onActive()回调通知开发者用户

(四)配置页面路由

  • Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是通过setMainRoute()方法来指定的。
  • 如果需要更改展示的AbilitySlice,可以通过addActionRoute()方法为此AbilitySlice配置一条路由规则。
  • addActionRoute()方法中使用的动作命名,需要在应用配置文件 (config.json) 中注册。

(五)生命周期案例 - 页面互相跳转

(六)页面间导航

1、同一Page内导航

使用present()或presentForResult()方法实现同一Page内两个AbilitySlice间的跳转。

如下代码片段展示通过点击按钮导航到其他AbilitySlice的方法:

Button button = ...;
button.setClickedListener(listener -> present(new TargetSlice(), new Intent()));

如下代码片段实现跳转时,从导航目标AbilitySlice返回后,系统将回调onResult()来接收和处理返回结果,代码示例如下:

Button button = ...;
button.setClickedListener(listener -> presentForResult(new TargetSlice(), new Intent(), 0));

2、不同Page间导航

通过配置Intent的Action,并使用startAbility()或startAbilityForResult()方法导航到目标Ability。获得返回结果的回调为onAbilityResult(),在Ability中调用setResult()可以设置返回结果。

(七)Intent - 意图

1、Intent概述

  • Intent是对象之间传递信息的载体。
  • Intent的构成元素包括Operation与Parameters,代码示例如下:
// 创建意图
Intent intent = new Intent();
// 设置意图参数
intent.setParam(CommonData.KEY_REMOTE_DEVICEID, localDeviceId);
// 创建操作对象
Operation operation = new Intent.OperationBuilder()
    .withDeviceId(deviceId)
    .withBundleName(getBundleName())
    .withAbilityName(CommonData.ABILITY_MAIN)
    .withAction(CommonData.DRAW_PAGE)
    .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
    .build();
// 设置操作
intent.setOperation(operation);
// 执行意图,实现页面跳转
startAbility(intent);

2、使用 Intent 启动应用

通过构造包含BundleName与AbilityName的Operation对象,可以启动一个Ability,并导航到该Ability。示例代码如下:

Intent intent = new Intent();
 
// 通过Intent中的OperationBuilder类构造operation对象
// 指定设备标识(空串表示当前设备)、应用包名、Ability名称
Operation operation = new Intent.OperationBuilder()
        .withDeviceId("")
        .withBundleName("com.demoapp")
        .withAbilityName("com.demoapp.FooAbility")
        .build();
 
// 把operation设置到intent中
intent.setOperation(operation);
startAbility(intent);

五、Particle Ability

(一)Particle Ability分类

1、Service Ability

主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。具有如下特性:

  • 可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行
  • 是单实例的,即在一个设备上,相同的Service只会存在一个实例
  • 是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service里创建新的线程来处理,防止造成主线程阻塞,应用程序无响应

2、Data Ability

使用Data模板的Ability(以下简称 “Data”)对外提供对数据的增、删、改、查,以及打开文件等接口。Data提供的接口的具体实现由开发者提供。

(二)Service Ability

调用Service方法的不同,其生命周期有以下两种路径:启动服务和连接服务。

1、启动服务

  • 通过将Intent传递给startAbility()方法来启动Service。不仅支持启动本地Service,还支持启动远程Service。
  • 可以通过构造包含DeviceIdBundleNameAbilityNameOperation对象来设置目标Service信息。这三个参数的含义如下:
    DeviceId:表示设备ID。如果是本地设备,则可以直接留空;如果是远程设备,可以通过 ohos.distributedschedule.interwork.DeviceManager提供的getDeviceList获取设备列表。
    BundleName:表示包名称。
    AbilityName:表示待启动的Ability名称。

2、连接服务

  • 如果Service需要与Page Ability或其他应用的Service Ability进行交互,则应创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。
  • 在使用connectAbility()处理回调时,需要传入目标Service的Intent与IAbilityConnection的实例。IAbilityConnection提供了两个方法供开发者实现:
    onAbilityConnectDone()用来处理连接的回调;
    onAbilityDisconnectDone()用来处理断开连接的回调。

3、停止服务

  • Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。要手动停止Service,有以下方法:
    – 在Service中通过terminateAbility()停止本Service;
    – 在其他Ability调用stopAbility()来停止Service。
  • 停止Service同样支持停止本地设备Service和停止远程设备Service,使用方法与启动Service一样。一旦调用停止Service的方法,系统便会尽快销毁Service。

(三)Data Ability

Data的提供方和使用方都通过URI (Uniform Resource Identifier)来标识一个具体的数据。

1、跨设备场景

2、本地场景

  • ///:是因为本地设备隐藏了device_id

六、思考题

  1. (判断题) Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。 ( )
    A. 正确
    B. 错误

  2. (多选题) HarmonyOS中,Ability可以分为( )和( ),以便实现不同的业务功能。
    A. BroadCast Ability
    B. Feature Ability
    C. Particle Ability
    D. Content Ability

  3. (多选题) 以下哪些是PageAbility的生命周期回调方法?( )
    A. onStart()
    B. onActive()
    C. onInactive()
    D. onBackground()
    E. onStop()
    F. onForeground()

以上是关于鸿蒙应用开发培训笔记03:Ability 设计与开发的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS(鸿蒙)—— Ability与页面

鸿蒙系统Ability概述

鸿蒙应用开发培训笔记02:应用开发入门

鸿蒙应用开发Ability和Android的activity不同之处

鸿蒙应用开发培训笔记01:HarmonyOS介绍

鸿蒙应用开发Ability介绍-了解和Android的activity不同之处