Ability是鸿蒙系统的重要组成部分,分为 FA(Feature Ability)和 PA(Particle Ability)两种类型,,每种类型提供了不同的模板。如下:
- FA: Page Ability 模板是 FA 唯一支持的模板,提供与用户交互的能力,类似Android系统中的Activity。
- PA:分为 Service Ability 和 Data Ability两种模版,Service模板:用于提供后台运行任务的能力,类似Android的后台服务Service。Data Ability用于对外部提供统一的数据访问抽象,类似Android的ContentProvider
在配置文件(config.json)中可用tpye来区分这三种类型,分别为“page”、“service”、“data”
{
"module": {
"abilities": [
{
"type": "page"
}
]
}
}
Page Ability
一个 Page 由一个或多个 AbilitySlice(相当于fragment) 构成,但是 Page 进入前台时界面默认只展示一个 AbilitySlice,通过 setMainRoute()方法来指定的
备注:AbilitySlice 是指应用的单个页面及其控制逻辑的总和。
public class MyAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
// set the main route
setMainRoute(MainSlice.class.getName());
}
}
生命周期
如图所示:
onStart()
首次创建 Page 实例时,触发该回调,然后进入 INACTIVE 状态。重写该方法,并在此配 置默认展示的 AbilitySlice。
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(FooSlice.class.getName());
}
onActive()
进入前台,获取焦点,与用户可交互,INACTIVE 状态
onInactive()
Page 失去焦点时,调用此方法,Page 进入 INACTIVE 状态
onBackground()
Page 不再对用户可见
onForeground()
处于 BACKGROUND 状态的 Page 仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此 Page),会调用此方法,而后 Page 的生命周期状态 回到 INACTIVE 状态。
onStop()
系统将要销毁 Page 时,将会触发此回调函数,通知用户进行系统资源的释放
AbilitySlice 生命周期
AbilitySlice 和 Page 具有相同的生命周期状态和同名的回调,同一 Page 中的 AbilitySlice 之间导航时,此时 Page 的生命周期状态不 会改变。
AbilitySlice 实例创建和管理通常由应用负责,系统仅在特定情况下会创建 AbilitySlice 实例。 例如,通过导航启动某个 AbilitySlice 时,是由系统负责实例化;但是在同一个 Page 中不同 的 AbilitySlice 间导航时则由应用负责实例化。
例如:MyAbility 下有 FooAbilitySlice 和 BarAbilitySlice,当前 FooAbilitySlice 处于前台并获得焦点,并即将导航到 BarAbilitySlice,在此期间的生命周期状态变化顺序为:
1. FooAbilitySlice 从 ACTIVE 状态变为 INACTIVE 状态。
2. BarAbilitySlice 则从 INITIAL 状态首先变为 INACTIVE 状态,然后变为 ACTIVE 状态(假定此前 BarAbilitySlice 未曾 启动)。
3. FooAbilitySlice 从 INACTIVE 状态变为 BACKGROUND 状态。
对应两个 slice 的生命周期方法回调顺序为:
FooAbilitySlice.onInactive() --> BarAbilitySlice.onStart() --> BarAbilitySlice.onActive() - -> FooAbilitySlice.onBackground()
在整个流程中,MyAbility 始终处于 ACTIVE 状态。但是,当 Page 被系统销毁时,其所有已 实例化的 AbilitySlice 将联动销毁,而不仅是处于前台的 AbilitySlice。
Service Ability
主要用于后台运行任务(如执行音乐播 放、文件下载等),但不提供用户交互界面
Service 是单实例的。在一个设备上,相同的 Service 只会存在一个实例。如果多个 Ability 共 用这个实例,只有当与 Service 绑定的所有 Ability 都退出后,Service 才能够退出。由于 Service 是在主线程里执行的,因此,如果在 Service 里面的操作时间过长,必须在 Service 里创建新的线程来处理。
生命周期
onStart()
创建的时候调用,用于初始化,只会调用一次。
onCommand()
service创建后调用,每次启动时都会调用。
onConnect()
Ability 和 Service 连接时调用,其中Ability 与 Service 交互是通过IRemoteObject对象实现的,只有第一个客户端连接 Service 时,系 统才会调用onConnect 方法来生成 IRemoteObject 对象,其他客户端连接此service时复用该IRemoteObject,无需重新调用onConnect
onDisconnect()
与Ability断开链接时调用
onStop()
Service 销毁时调用
启动Service有两种途径,生命周期都有点差别
- 启动 Service,在 Ability 调用 startAbility()时创建,调用stopAbility()来停止,停止后会系统将其销毁
- 连接 Service,其他 Ability 调用 connectAbility()时创建,调用 disconnectAbility()断开连接。多个客户端可以绑定到相同 Service,而且当所有绑定全部取消后,系统即会销毁该 Service。