#跟着坚果学鸿蒙#AbilitySlice 间导航
#跟着坚果学鸿蒙#同一 Page 内导航 当发起导航的 AbilitySlice 和导航目标的 AbilitySlice 处于同一个 Page 时,您可以 通过 present()方法实现导航。如下代码片段展示通过点击按钮导航到其他 AbilitySlice 的方法:
@Override
protected void onStart(Intent intent) {
...
Button button = ...;
button.setClickedListener(listener -> present(new TargetSlice(),
new Intent()));
...
}
如果开发者希望在用户从导航目标 AbilitySlice 返回时,能够获得其返回结果, 则应当使用 presentForResult()实现导航。用户从导航目标 AbilitySlice 返回时, 系统将回调 onResult()来接收和处理返回结果,开发者需要重写该方法。返回结 果由导航目标 AbilitySlice 在其生命周期内通过 setResult()进行设置。
@Override
protected void onStart(Intent intent) {
...
Button button = ...;
button.setClickedListener(listener -> presentForResult(new
TargetSlice(), new Intent(), 0));
...
}
@Override
protected void onResult(int requestCode, Intent resultIntent) {
if (requestCode == 0) {
// Process resultIntent here.
}
}
系统为每个 Page 维护了一个 AbilitySlice 实例的栈,每个进入前台的 AbilitySlice 实例均会入栈。当开发者在调用 present()或 presentForResult() 时指定的 AbilitySlice 实例已经在栈中存在时,则栈中位于此实例之上的 AbilitySlice 均会出栈并终止其生命周期。前面的示例代码中,导航时指定的 AbilitySlice 实例均是新建的,即便重复执行此代码(此时作为导航目标的这些 实例是同一个类),也不会导致任何 AbilitySlice 出栈。
不同 Page 间导航 不同 Page 中的 AbilitySlice 相互不可见,因此无法通过 present()或 presentForResult()方法直接导航到其他 Page 的 AbilitySlice。AbilitySlice 作为 Page 的内部单元,以 Action 的形式对外暴露,因此可以通过配置 Intent 的 Action 导航到目标 AbilitySlice。Page 间的导航可以使用 startAbility()或 startAbilityForResult()方法,获得返回结果的回调为 onAbilityResult()。在 Ability 中调用 setResult()可以设置返回结果。详细用法可参考根据 Operation 的其他属性启动应用中的示例。
跨设备迁移
跨设备迁移(下文简称“迁移”)支持将 Page 在同一用户的不同设备间迁移,以 便支持用户无缝切换的诉求。以 Page 从设备 A 迁移到设备 B 为例,迁移动作主 要步骤如下: 1.设备 A 上的 Page 请求迁移。 2.HarmonyOS 处理迁移任务,并回调设备 A 上 Page 的保存数据方法,用于保存 迁移必须的数据。 3.HarmonyOS 在设备 B 上启动同一个 Page,并回调其恢复数据方法。 开发者可以参考以下详细步骤开发具有迁移功能的 Page。
实现 IAbilityContinuation 接口 ⚫ onStartContinuation() Page 请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否 可以执行迁移,比如,弹框让用户确认是否开始迁移。 ⚫ onSaveData() 如果 onStartContinuation()返回 true,则系统回调此方法,开发者在此回调中保 存必须传递到另外设备上以便恢复 Page 状态的数据。 ⚫ onRestoreData() 源侧设备上 Page 完成保存数据后,系统在目标侧设备上回调此方法,开发者在 此回调中接受用于恢复 Page 状态的数据。注意,在目标侧设备上的 Page 会重新 启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在 onStart() 之前。
⚫ onCompleteContinuation() 目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调 Page 的此方法, 以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此 处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。
⚫ onRemoteTerminated() 如果开发者使用 continueAbilityReversibly()而不是 continueAbility(),则此后可以 在源侧设备上使用 reverseContinueAbility()进行回迁。这种场景下,相当于同一 个 Page(的两个实例)同时在两个设备上运行,迁移完成后,如果目标侧设备 上 Page 因任何原因终止,则源侧 Page 通过此回调接收终止通知。
请求迁移 实现 IAbilityContinuation 的 Page 可以在其生命周期内,调用 continueAbility()或 continueAbilityReversibly()请求迁移。两者的区别是,通过后者发起的迁移此后可 以进行回迁。
try {
continueAbility();
} catch (IllegalStateException e) {
// Maybe another continuation in progress.
...
}
以 Page 从设备 A 迁移到设备 B 为例,详细的流程如下: 1. 设备 A 上的 Page 请求迁移。 2. 系统回调设备 A 上 Page 及其 AbilitySlice 栈中所有 AbilitySlice 实例的 IAbilityContinuation.onStartContinuation()方法,以确认当前是否可以立 即迁移。
3. 如果可以立即迁移,则系统回调设备 A 上 Page 及其 AbilitySlice 栈中所 有 AbilitySlice 实例的 IAbilityContinuation.onSaveData()方法,以便保存 迁移后恢复状态必须的数据。 4. 如果保存数据成功,则系统在设备 B 上启动同一个 Page,并恢复 AbilitySlice 栈,然后回调 IAbilityContinuation.onRestoreData()方法,传 递此前保存的数据;此后设备 B 上此 Page 从 onStart()开始其生命周期回 调。 5. 系统回调设备 A 上 Page 及其 AbilitySlice 栈中所有 AbilitySlice 实例的 IAbilityContinuation.onCompleteContinuation()方法,通知数据恢复成 功与否。
请求回迁 使用 continueAbilityReversibly()请求迁移并完成后,源侧设备上已迁移的 Page 可以发起回迁,以便使用户活动重新回到此设备。
try {
reverseContinueAbility();
} catch (IllegalStateException e) {
// Maybe another continuation in progress.
...
}
以 Page 从设备 A 迁移到设备 B 后并请求回迁为例,详细的流程如下: (1) 设备 A 上的 Page 请求回迁。 (2) 系统回调设备 B 上 Page 及其 AbilitySlice 栈中所有 AbilitySlice 实例的 IAbilityContinuation.onStartContinuation()方法,以确认当前是否可以立 即迁移。 (3) 如果可以立即迁移,则系统回调设备 B 上 Page 及其 AbilitySlice 栈中所 有 AbilitySlice 实例的 IAbilityContinuation.onSaveData()方法,以便保存 回迁后恢复状态必须的数据。(4) 如果保存数据成功,则系统在设备 A 上 Page 恢复 AbilitySlice 栈,然后 回调 IAbilityContinuation.onRestoreData()方法,传递此前保存的数据。 (5) 如果数据恢复成功,则系统终止设备 B 上 Page 的生命周期。
更多推荐

所有评论(0)