应用接续实战 原创

一路向北545
发布于 2024-12-15 17:04
浏览
0收藏

一、简介

应用接续,指当用户在一个设备上操作某个应用时,可以在另一个设备的同一个应用中快速切换,并无缝衔接上一个设备的应用体验。

比如我们在使用手机进行文字编辑时,此时想使用带键盘的平板继续编辑,那么无需重新打字,而是继续之前的内容。接续完成后,之前设备的应用可退出或保留,用户可以将注意力集中在被拉起的设备上,继续执行任务。


如图所示:


应用接续实战-鸿蒙开发者社区


应用接续实战-鸿蒙开发者社区


二、运作机制

以此例为例:

在源端也就是手机端,通过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()的实现相同。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-12-15 17:05:57修改
收藏
回复
举报
回复
    相关推荐