100KB 的硬指标卡住了多少开发者

我们在截图整理工具里接入了跨端接续功能:用户在手机上浏览截图,走到哪,拿起平板,画面无缝流转到平板继续看。听起来很酷,但调试时发现,只要当前截图的高清缩略图稍微大一点,流转到平板后就是一张白纸。

翻开 HarmonyOS 的接续文档,有一行字非常醒目:onContinue 中通过 wantParam 传输的数据需要控制在 100KB 以下。为什么?因为接续背后的设备发现、连接、状态同步走的是系统级的轻量通道。100KB 也就勉强塞下一张压缩过的缩略图,或者一段稍微长一点的文字。超过这个限制,系统不会报错,只会默默截断,或者直接拒绝流转。

控制面与数据面分离

要解决这个问题,思路其实很清晰:把数据拆分为“控制面”和“数据面”。wantParam 只作为控制面,告诉平板“当前在哪一页,看的是哪张图”;真正的图片二进制数据,通过“数据面”——也就是分布式文件系统或分布式数据对象——在平板端主动拉取。

typescript

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onContinue(wantParam: Record<string, Object>): AbilityConstant.OnContinueResult {
    // 只传路由标识和业务 ID
    wantParam.route = 'DetailPage';
    wantParam.currentShotId = this.currentShotId;
    
    // 传入当前应用版本,如果平板版本低,拒绝接续
    if (wantParam.version < 1000) {
      return AbilityConstant.OnContinueResult.MISMATCH;
    }

    return AbilityConstant.OnContinueResult.AGREE;
  }
}

onContinue 返回 AGREE 表示允许接续。如果在这里你做任何耗时的文件写入或云端上传,都会导致流转动画卡住。正确的做法是在返回 AGREE 之后,在平板的 onCreate 或 onNewWant 里识别 launchReason === CONTINUATION,然后拿着 currentShotId 去本地缓存或分布式文件里找图。

多端状态一致性的容错处理

平板拿到 currentShotId 后,如果本地由于网络或者同步延迟没有这张图怎么办?如果直接崩溃或者显示白屏,体验极差。

我们需要一个优雅的降级逻辑:平板端从 wantParam 拿到 ID 后,去分布式数据库查询;如果查不到,显示骨架屏,同时利用 want.parameters 里的设备标识,通过跨设备 RPC 通信向手机端请求这张图的数据。

接续不是简单的状态复制,它本质上是一次跨设备的业务逻辑流转。数据大了怎么传、没查到怎么办、版本不兼容怎么退,把这三个问题想清楚,你的接续才不会变成只会演示的“玩具功能”。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐