你说要做“超级终端”多设备协同——但你真的分得清:发现、调用、多屏、流转各自该干啥吗?

举报
bug菌 发表于 2025/12/25 12:00:06 2025/12/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🥹前言:先给你打个“预防针”多设备协同这块最容易出现一种“幻觉”:以...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🥹前言:先给你打个“预防针”

多设备协同这块最容易出现一种“幻觉”:以为只要能拿到 deviceId,剩下全是 startAbility 一把梭
  结果一上真机:设备找不到、权限弹窗乱飞、协同窗口不出来、流转一半卡住……然后你开始怀疑人生🫠。
别急!把它拆成 4 件事,你就会发现它其实很“工程化”:
设备发现 → 分布式硬件调用 → 多屏协同 → 自由流转,每一步都有自己该走的路。

1️⃣ 🔍设备发现:先“看见”设备,再谈协同(不然都是空谈)

设备发现的目标很朴素:拿到可信设备列表(deviceId / networkId 等),给后续同步、跨设备拉起、分布式硬件调用当“门票”。
在官方的 CodeLab 示例里,获取网络中可信设备列表会用到 getTrustedDeviceListSync,并且需要在权限里声明分布式相关权限(如 DISTRIBUTED_DATASYNCGET_DISTRIBUTED_DEVICE_INFO 等)。

🧪实战代码:拿到可信设备列表(ArkTS 示例,够你直接改)

这段思路非常常用:打开弹窗→列设备→用户选设备→保存 deviceId(后面你要跨端拉起、同步、投放都靠它)。

import deviceManager from '@ohos.distributedHardware.deviceManager';

type SimpleDevice = { deviceId: string; deviceName: string };

let dm: any;

function getTrustedDevices(): SimpleDevice[] {
  if (!dm) {
    dm = deviceManager.createDeviceManager('com.example.demo'); // bundleName
  }
  // ✅官方 CodeLab 场景中使用的接口:获取可信设备列表
  const list = dm.getTrustedDeviceListSync();
  return (list ?? []).map((d: any) => ({
    deviceId: d.deviceId,
    deviceName: d.deviceName
  }));
}

// 记得页面退出时释放
function releaseDM() {
  if (dm) dm.release();
  dm = null;
}

💡小提示(很关键):

  • “可信设备”不是“附近设备”。可信通常意味着同账号/已配对/已授权等条件满足,否则你会看到“啥也没有”的空列表😅。
  • 设备发现/信息获取常常离不开权限声明与动态授权,别等报错才想起来补权限。

2️⃣ 🧲分布式硬件调用:把别的设备“当外设用”才叫协同

如果说“跨设备拉起 Ability”是把任务搬过去,那分布式硬件更像是:

“任务还在我这跑,但我可以用你那台设备的摄像头/麦克风/屏幕/图库等能力。”

这类能力在“自由流转”的多端协同典型场景里也经常出现,比如“跨设备互通提供相机、扫描、图库访问能力”。
官方也提供了“硬件跨设备连接管理/分布式相机开发指南”这类指导入口。

🎥以“分布式相机”举个通俗例子

你在平板上开会,想调用手机更好的摄像头:

  • 平板 App 还是平板 App(UI、逻辑在平板)
  • 但相机能力来自手机(“远端相机”)
    有些实践会通过相机枚举结果里的连接类型来区分本地/远端相机,然后像操作本地相机一样操作远端相机。

😄我个人建议:分布式硬件调用一定要做“能力探测 + 降级”。
比如远端相机不可用就切回本地相机,别让用户对着一个转圈圈的 loading 发呆。


3️⃣ 🖥️多屏协同:用户以为是“投屏”,其实是“可交互的协同窗口”

多屏协同(尤其在“超级终端”里)用户感知通常是:

  • 手机上的应用/内容能在电脑/平板上出现一个协同窗口
  • 能拖拽文件、复制粘贴、甚至操作手机应用
    官方消费者支持页面对“超级终端/多屏协同”的描述就是:把手机与电脑、平板建立协同连接,在协同窗口中浏览编辑文件、拖拽互传、复制粘贴等提升效率。

✅开发侧你要抓住的核心:UI 适配 + 交互一致 + 状态连续

多屏协同做得“高级”的关键不是炫技,而是三点:

  1. 布局响应式:窗口变大变小,内容结构能自然重排(分栏、断点)
  2. 交互差异化:触屏 vs 键鼠 vs 遥控器,不同输入方式要有对应体验
  3. 状态不断档:选中态、编辑态、播放进度、草稿内容——别一切设备就“回到首页”,用户会气笑😅

4️⃣ 🔄自由流转:别把“流转”只理解成“切设备继续用”

官方对“自由流转”的定义更系统:

  • 流转是跨多设备的分布式操作统称
  • 场景分为两类:跨端迁移多端协同

🧭4.1 跨端迁移(应用接续):任务从 A 搬到 B,状态还得带上

官方“应用接续开发指导”写得很直白:可以把当前任务(包括页面控件状态变量等)迁移到目标设备并接续使用;并提到需要在 module.json5 里配置 UIAbility continuable: true,并实现 onContinue 等回调。
它还强调了实际使用限制(比如同账号、WLAN+蓝牙等)以及在 onContinue 通过 wantParam 传输的数据建议控制在 100KB 以内,大数据建议用分布式数据对象。

🧪代码味儿来点:实现 onContinue / 目的端恢复(示意版)

import UIAbility from '@ohos.app.ability.UIAbility';
import wantConstant from '@ohos.app.ability.wantConstant';

export default class EntryAbility extends UIAbility {
  // 源端:准备迁移数据
  onContinue(wantParam: { [key: string]: Object }) {
    // ✅把关键状态塞进去(控制体积,别塞大对象)
    wantParam['draftText'] = this.context.cacheDir; // 示例:实际请放业务状态
    wantParam['progress'] = 0.72;

    // 你也可以根据场景决定是否允许迁移
    return 'AGREE';
  }

  // 目的端:冷启动恢复
  onCreate(want: any, launchParam: any) {
    const params = want?.parameters ?? {};
    console.info(`🔄 restore progress=${params.progress}`);
  }

  // 目的端:热启动恢复(单实例)
  onNewWant(want: any) {
    const params = want?.parameters ?? {};
    console.info(`♻️ restore draft=${params.draftText}`);
  }
}

😄一句很现实的话:
接续做得好,用户觉得你是“无缝”;接续做不好,用户觉得你是“重启”。
差别就藏在“状态保存/恢复”这点小细节里。

🤝4.2 多端协同:不是搬家,是“多台设备一起干活”

自由流转概述里也给了多端协同的开发层定义:多端不同 UIAbility/Service 同时或交替运行实现业务,或多端相同能力同时运行实现完整业务。
典型能力比如跨设备拖拽、跨设备剪贴板、跨设备互通等,都属于多端协同场景的常用拼图。

🧠一张“工程脑”总结:四件事各自的正确姿势

  • 🔍 设备发现:拿到可信设备列表 + 权限/配对先打通
  • 🧲 分布式硬件:能力探测 + 远端/本地降级 + 体验兜底
  • 🖥️ 多屏协同:响应式 UI + 多输入适配 + 状态连续
  • 🔄 自由流转:区分“跨端迁移”和“多端协同”,数据大小、权限、网络条件都要考虑

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。