应用接续实战 原创
一、简介
应用接续,指当用户在一个设备上操作某个应用时,可以在另一个设备的同一个应用中快速切换,并无缝衔接上一个设备的应用体验。
比如我们在使用手机进行文字编辑时,此时想使用带键盘的平板继续编辑,那么无需重新打字,而是继续之前的内容。接续完成后,之前设备的应用可退出或保留,用户可以将注意力集中在被拉起的设备上,继续执行任务。
如图所示:
二、运作机制
以此例为例:
在源端也就是手机端,通过UIAbility的onContinue()回调,开发者可以保存待接续的业务数据(TextInput组件的输入内容)。系统将自动保存页面状态,如当前页面的浏览进度;开发者需要通过onContinue接口保存页面等业务内容。
分布式框架提供跨设备应用界面、页面栈以及业务数据的保存和恢复机制,负责将数据从源端(手机)发送到对端(平板)。
在对端,同一UIAbility通过onCreate/onNewWant接口恢复业务数据。
三、使用限制
(1)双端设备需要登录同一华为账号。
(2)双端设备需要打开Wi-Fi和蓝牙开关。 条件允许时,建议双端设备接入同一个局域网,可提升数据传输的速度。
(3)应用接续只能在同应用(UIAbility)之间触发,双端设备都需要有该应用。
(4)为了接续体验,在onContinue回调中使用wantParam传输的数据需要控制在100KB以下,大数据量请使用分布式数据对象进行同步。
四、开发步骤
(1)启用应用接续能力
在module.json5文件的abilities中,将continuable标签配置为“true”,表示该UIAbility可被迁移。配置为false的UIAbility将被系统识别为无法迁移且该配置默认值为false。
{
"abilities": [
{
"continuable": true,
}
]
}
(2)根据需要配置应用启动模式类型
{
"abilities": [
{
"launchType": "singleton"
}
]
}
(3)将TextInput组件输入的内容存入AppStroage中
@Entry
@Component
struct Index {
@StorageLink("content") content: string = ""
build() {
Column() {
TextInput({ placeholder: "请输入内容", text: $$this.content })
}
.height('100%')
.width('100%')
}
}
(4)在源端UIAbility中实现onContinue()接口
返回值为AGREE表示同意接续
onContinue(wantParam: Record<string, Object>): AbilityConstant.OnContinueResult | Promise<AbilityConstant.OnContinueResult> {
//来自与TextInput组件的输入内容
let content: string | undefined = AppStorage.get("content")
if (content) {
// 将要迁移的数据保存在wantParam的自定义字段(如:data)中;
wantParam["data"] = content;
}
return AbilityConstant.OnContinueResult.AGREE;
}
(5)在目标端UIAbility中实现onCreate()与onNewWant()接口,恢复迁移数据。
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.restoreData(want, launchParam)
}
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.restoreData(want, launchParam)
}
storage: LocalStorage = new LocalStorage();
restoreData(want: Want, launchParam: AbilityConstant.LaunchParam) {
if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
// 将上述的保存的数据取出恢复
let continueInput: string | undefined = "";
if (want.parameters != undefined) {
continueInput = want.parameters.data.toString()
AppStorage.setOrCreate("content", continueInput)
console.info(`continue input ${continueInput}`)
}
// 触发页面恢复
this.context.restoreWindowStage(this.storage);
}
}
自此接续功能完成,只有一个设备打开app,另一台设备桌面底部就会显示接续标志,点击即可进行接续。
五、注意事项
接口restoreWindowStage(this.storage)必须在同步接口方法中执行,如果在异步回调中执行,可能会导致应用迁移后页面加载失败。
如果是单实例应用,需要额外实现onNewWant()接口,实现方式与onCreate()的实现相同。