鸿蒙应用开发培训笔记03:Ability 设计与开发
文章目录
零、本讲学习目标
- Ability和AbilitySlice的概念
- 理解FA (Feature Ability)和PA (Particle Ability)
- 理解Page Ability、Service Ability与Data Ability的关系
一、Ability 是什么?
(一)Ability概念
Ability的中文意思是能力。在HarmonyOS中,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。
(三)案例涉及知识点
- PageAbility和AbilitySlice,以及它们的生命周期回调方法
- Intent,以及如何使用它来实现页面跳转
- Service Ability,主要用于后台运行任务
- 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()));
- 1
- 2
如下代码片段实现跳转时,从导航目标AbilitySlice返回后,系统将回调onResult()来接收和处理返回结果,代码示例如下:
Button button = ...;
button.setClickedListener(listener -> presentForResult(new TargetSlice(), new Intent(), 0));
- 1
- 2
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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
五、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。
- 可以通过构造包含
DeviceId
、BundleName
与AbilityName
的Operation
对象来设置目标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
六、思考题
-
(判断题) Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。 ( )
A. 正确
B. 错误 -
(多选题) HarmonyOS中,Ability可以分为( )和( ),以便实现不同的业务功能。
A. BroadCast Ability
B. Feature Ability
C. Particle Ability
D. Content Ability -
(多选题) 以下哪些是PageAbility的生命周期回调方法?( )
A. onStart()
B. onActive()
C. onInactive()
D. onBackground()
E. onStop()
F. onForeground()
文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。
原文链接:howard2005.blog.csdn.net/article/details/122540938
- 点赞
- 收藏
- 关注作者
评论(0)