十二、Ability 概述
一个应用可以有多个 Ability。
Ability 分为两种类型 FA(Feature Ability), PA(Particle Ability)
每种类型都提供了不同的模板,供开发者使用。
FA:只有 Page 模板,用于提供与用户交互的能力,一个 Page 实例可包含一组页面,每个页面用一个 AbilitySlice 实例表示。
PA:支持两个模板
Service 模板:后台运行任务。
Data 模板:对外部提供统一的数据访问。
至于这个 Ability 究竟是上面三种的哪一种,通过配置表示。
Page 结构
当一个 Page 中包含多个 AbilitySlice 时,这些 AbilitySlice 应该具有较大的功能相关性,比如:外卖列表和外卖详情页面两个 AbilitySlice 都放在一个 Page 里。
AbilitySlice 路由配置:
进入 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());
}
}
跳转到其他 AbilitySlice:
@Override
protected void onStart(Intent intent) {
...
Button button = ...;
//通过present方法,里面的intent可以直接传新对象,
//也可以传输信息
button.setClickedListener(listener -> present(new TargetSlice(), new Intent()));
...
}
Page 生命周期
系统管理或用户操作均会引起 Page 实例改变生命周期状态。
onStart():
仅在系统第一次创建 Page 实例调用,调用后 Page 进入 INACTIVE 状态。开发时必须重写此方法,并声明默认展示的 AbilitySlice。
示例:
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(FooSlice.class.getName());
}
onActive():
Page 进入 INACTIVE 状态后,自动调用该方法,进入 ACTIVE 状态。这个状态就是应用与用户交互的状态,Page 会一直保持这个状态,除非失去焦点。
onInactive():
失去焦点时调用这个方法。
onBackground():
Page 对用户不可见时,系统自动调用该方法通知开发者进行相应的资源释放。
onForeground():
后台运行回到前台时,系统调用该方法,该方法用于开发者重新申请不可见时释放的资源,然后系统调用 onActive 方法通知开发者。
onStop():
关闭 Page 时调用,通知进行资源释放。
关闭有 4 种情况:
1.任务管理器关闭
2.从应用中退出
3.配置改变
4.系统管理资源时自动触发关闭
AbilitySlice 生命周期:
AbilitySlice 是 Page 的组成部分,它的生命周期和 Page 一样。当同一 Page 下的 AbilitySlice 切换时,AbilitySlice 生命周期改变,Page 生命周期不改变。
例如:
HelloAbility 下的 HelloAAbilitySlice 和 HelloBAbilitySlice。HelloAAbilitySlice 当前获得焦点再导航至 HelloBAbilitySlice,它们生命周期变化是:
1.HelloAAbilitySlice 从 ACTIVE 变成 INACTIVE
2.HelloBAbilitySlice 从 INACTIVE 变成 ACTIVE
3.HelloAAbilitySlice 从 INACTIVE 变成 BACKGROUND
鸿蒙 OS 跨设备迁移
鸿蒙 OS 可以将 Page 在用户的不同设备间来回切换。
步骤:
1.设备 A 请求迁移
2.鸿蒙 OS 处理请求,并保存设备 A 的数据。
3.鸿蒙 OS 在设备 B 启动同一个 Page,并恢复数据
具体实现:
使用 IAbilityContinuation 接口。
onStartContinuation():
Page 请求迁移后,首先调用此方法,开发者在此决策是否开始迁移。
onSaveData()
上个方法返回 True,开始调用这个方法,用于保存数据。
onRestoreData()
保存好数据后,在目标端调用这个方法,恢复之前保存的数据。
onCompleteContinuation()
目标端数据恢复完成后调用此方法通知迁移结束。
onRemoteTerminated()
用于源端进行回迁。