跨设备迁移(下文简称“迁移”)支持将 page 在同一用户的不同设备间迁移,以便支持用户无缝切换的诉求。以 page 从设备 a 迁移到设备 b 为例,迁移动作主要步骤如下:
设备 a 上的 page 请求迁移。
harmonyos 处理迁移任务,并回调设备 a 上 page 的保存数据方法,用于保存迁移必须的数据。
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 通过此回调接收终止通知。
说明
一个应用可能包含多个 page,仅支持迁移的 page 需要实现 iabilitycontinuation 接口。同时,此 page 所包含的所有 abilityslice 也需要实现此接口。
请求迁移
实现 iabilitycontinuation 的 page 可以在其生命周期内,调用 continueability() 或 continueabilityreversibly() 请求迁移。两者的区别是,通过后者发起的迁移此后可以进行回迁。
try { continueability();} catch (illegalstateexception e) { // maybe another continuation in progress. ...}
以 page 从设备 a 迁移到设备b为例,详细的流程如下:
设备 a 上的 page 请求迁移。
系统回调设备 a 上 page 及其 abilityslice 栈中所有 abilityslice 实例的 iabilitycontinuation.onstartcontinuation() 方法,以确认当前是否可以立即迁移。
如果可以立即迁移,则系统回调设备 a 上 page 及其 abilityslice 栈中所有 abilityslice 实例的 iabilitycontinuation.onsavedata() 方法,以便保存迁移后恢复状态必须的数据。
如果保存数据成功,则系统在设备 b 上启动同一个 page ,并恢复 abilityslice 栈,然后回调 iabilitycontinuation.onrestoredata() 方法,传递此前保存的数据;此后设备 b 上此 page 从 onstart() 开始其生命周期回调。
系统回调设备 a 上 page 及其 abilityslice 栈中所有 abilityslice 实例的 iabilitycontinuation.oncompletecontinuation() 方法,通知数据恢复成功与否。
请求回迁
使用 continueabilityreversibly() 请求迁移并完成后,源侧设备上已迁移的 page 可以发起回迁,以便使用户活动重新回到此设备。
try { reversecontinueability();} catch (illegalstateexception e) { // maybe another continuation in progress. ...}
以page从设备a迁移到设备b后并请求回迁为例,详细的流程如下:
设备 a 上的 page 请求回迁。
系统回调设备 b 上 page 及其 abilityslice 栈中所有 abilityslice 实例的 iabilitycontinuation.onstartcontinuation() 方法,以确认当前是否可以立即迁移。
如果可以立即迁移,则系统回调设备 b 上 page 及其 abilityslice 栈中所有 abilityslice 实例的 iabilitycontinuation.onsavedata() 方法,以便保存回迁后恢复状态必须的数据。
如果保存数据成功,则系统在设备 a 上 page 恢复 abilityslice 栈,然后回调 iabilitycontinuation.onrestoredata() 方法,传递此前保存的数据。
如果数据恢复成功,则系统终止设备 b 上 page 的生命周期。