由于没有设备,模拟器又不支持启动多个,所以该功能没有实践,只贴代码,以后有机会再更新。
跨设备迁移,就是讲一个Ability(页面),从A设备,显示到B设备上的功能。
首先,讲需要迁移的Ability和它包含的Slice都实现IAbilityContinuation接口,并实现该接口的所有方法
package com.example.continuationdemo.slice;
import com.example.continuationdemo.MyApplication;
import com.example.continuationdemo.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.ability.IAbilityContinuation;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.IntentParams;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation {
static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
Button btnStartAbility= (Button) findComponentById(ResourceTable.Id_btn_start_ability);
if (btnStartAbility != null) {
// 为按钮设置点击回调
btnStartAbility.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
try {
continueAbility();
//请求迁移后,调用该页面的onStartContinuation()方法
} catch (IllegalStateException e) {
// Maybe another continuation in progress.
}
}
});
}
}
@Override
public boolean onStartContinuation() {
//该方法在源设备执行
//Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
//返回true,表示可以迁移,执行onSaveData()方法
return false;
}
@Override
public boolean onSaveData(IntentParams intentParams) {
//该方法在源设备执行
//如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。
//返回true表示保存数据成功
return false;
}
@Override
public boolean onRestoreData(IntentParams intentParams) {
//该方法在目标设备执行
//源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。
// 注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。
return false;
}
@Override
public void onCompleteContinuation(int i) {
//该方法在源设备执行
//目标设备上执行完onRestoreData方法以后,回调该方法,通知迁移成功
}
}