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

🏆本文收录于「滚雪球学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_DATASYNC、GET_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 适配 + 交互一致 + 状态连续
多屏协同做得“高级”的关键不是炫技,而是三点:
- 布局响应式:窗口变大变小,内容结构能自然重排(分栏、断点)
- 交互差异化:触屏 vs 键鼠 vs 遥控器,不同输入方式要有对应体验
- 状态不断档:选中态、编辑态、播放进度、草稿内容——别一切设备就“回到首页”,用户会气笑😅
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-
- 点赞
- 收藏
- 关注作者
评论(0)