在这里插入图片描述

摘要

随着设备形态越来越多,手机、平板、智慧屏、智能穿戴已经不再是孤立存在的设备。用户真正需要的是:
一个任务可以在多个设备之间自由流转,甚至由多个设备一起完成。

鸿蒙系统提出的“分布式”并不是简单的设备互联,而是把多设备当成“一台虚拟超级终端”。
本文将围绕跨设备协作任务这一核心需求,结合鸿蒙系统的分布式软总线、Ability 迁移、分布式数据能力,讲清楚:

  • 跨设备协作到底是怎么一回事
  • 实际项目中应该怎么选技术方案
  • 如何写出一个可以跑起来的 Demo
  • 在真实场景(如远程升级)中该怎么用

引言

在传统系统里,如果我们想让手机和另一台设备协作,往往要做一堆事情:

  • 自己实现设备发现
  • 自己维护网络连接
  • 自己定义通信协议
  • 自己处理断线和重连

说白了,业务还没开始,通信逻辑已经写了一大半

鸿蒙系统在系统层就把这些能力封装好了,开发者只需要关心三件事:

  1. 设备能不能被发现
  2. 任务是迁移执行,还是并行执行
  3. 状态怎么同步

只要想清楚这三点,跨设备协作就会变得非常自然。

鸿蒙跨设备协作的整体设计思路

跨设备协作并不是“炫技”,而是一个很现实的工程问题。

一句话总结就是:

设备先能互相看见,然后任务能在设备之间流转,最后所有设备对任务状态有一致认知。

对应到鸿蒙系统中,通常是下面这套组合拳:

  • 分布式软总线:设备发现与认证
  • Ability / UIAbility:任务迁移和界面协同
  • 分布式数据服务:状态同步与协作

跨设备协作的基本流程

从流程上看,大致是这样:

设备A
  |
  | 发现设备 & 认证
  v
设备B / 设备C
  |
  | 任务迁移 or 并行执行
  v
分布式数据同步状态

不同项目的差别,主要体现在“任务是怎么分”的。

常见的协作模式

简单总结三种最常见的模式:

  1. 任务整体迁移

    • 比如:手机上的任务拖到平板继续做
  2. 任务拆分并行执行

    • 比如:多个设备一起处理一个复杂流程
  3. UI 与能力分离协作

    • 比如:手机控制,智慧屏展示

下面我们就按这些模式来讲代码。

设备发现与协作基础能力

在鸿蒙中,只要设备满足条件(同账号、同网络等),系统就能自动帮你发现。

开发者真正需要做的,是监听设备状态变化

使用分布式软总线发现设备

示例代码(可直接运行在 Stage 模型中)

import deviceManager from '@ohos.distributedDeviceManager';

const BUNDLE_NAME = 'com.example.distributeddemo';

let dm = deviceManager.createDeviceManager(BUNDLE_NAME);

dm.on('deviceStateChange', (data) => {
  console.info('设备状态变化:' + JSON.stringify(data));
});

代码说明

  • createDeviceManager 用来创建设备管理实例
  • 系统会自动维护设备列表
  • deviceStateChange 会在设备上线、下线时触发

这里不需要你写任何网络代码,设备能不能连,系统已经帮你兜底了。

跨设备任务迁移实现

任务迁移是鸿蒙最有代表性的能力之一。

最直观的体验就是:
同一个任务,从手机“甩”到平板,接着用。

Ability 迁移的基本原理

Ability 迁移做了两件事:

  1. 把当前 Ability 的状态保存下来
  2. 在另一台设备上恢复这个状态

只要你在 Ability 里配合好生命周期,就能实现。

Demo:支持迁移的 UIAbility

Ability 核心代码

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

export default class MainAbility extends UIAbility {
  private progress: number = 0;

  onStart(want) {
    if (want?.parameters?.progress !== undefined) {
      this.progress = want.parameters.progress;
    }
    console.info('Ability 启动,当前进度:' + this.progress);
  }

  onContinue(wantParam) {
    // 保存当前状态
    wantParam.setParam('progress', this.progress);
    console.info('开始迁移,保存进度:' + this.progress);
    return true;
  }
}

代码解释

  • onContinue 是迁移的关键方法
  • 在这里把当前任务状态塞进 wantParam
  • 目标设备启动时再从 want.parameters 取出来

这样一来,任务在哪台设备上并不重要

多设备并行协作的实现方式

如果说任务迁移更像“接力”,
那并行协作更像“分工合作”。

使用分布式数据同步任务状态

分布式 KV 数据服务非常适合用来做协作状态同步。

创建分布式 KV Store

import distributedData from '@ohos.data.distributedData';

let kvManager = distributedData.createKVManager();
let kvStore = await kvManager.getKVStore('task_store');

更新任务状态

await kvStore.put('task_step', 'download_finished');

监听状态变化

kvStore.on('dataChange', (data) => {
  console.info('收到任务状态更新:' + JSON.stringify(data));
});

代码说明

  • put 会自动同步到其他设备
  • 其他设备不需要主动拉取
  • 很适合用来做任务阶段流转

结合实际场景的应用示例

下面我们用 3 个真实项目中很常见的场景来说明。

场景一:远程升级任务协作

场景描述

  • 手机:发起升级、展示进度
  • 设备A:下载升级包
  • 设备B:校验升级包
  • 设备C:执行升级与重启

示例:设备A 下载完成后更新状态

await kvStore.put('upgrade_status', 'download_ok');

示例:设备B 监听并开始校验

kvStore.on('dataChange', (data) => {
  if (data.key === 'upgrade_status' && data.value === 'download_ok') {
    console.info('开始校验升级包');
  }
});

场景二:多设备协作编辑

场景描述

  • 平板负责主要编辑界面
  • 手机负责快捷输入
  • 智慧屏负责预览

示例:同步编辑内容

await kvStore.put('doc_content', currentText);

其他设备监听 doc_content,实时刷新 UI。

场景三:手机控制 + 大屏展示

场景描述

  • 手机作为遥控器
  • 智慧屏只负责展示

示例:同步播放进度

await kvStore.put('play_progress', 120);

智慧屏监听进度并刷新播放状态。

常见问题 QA

Q1:跨设备通信需要自己处理网络吗?

不需要。
分布式软总线已经帮你做了设备发现、认证和连接。

Q2:分布式数据适合传大文件吗?

不适合。
它更适合传状态、进度、小规模结构化数据。

Q3:任务迁移和并行协作能一起用吗?

完全可以。
实际项目里经常是 UI 迁移 + 后台并行协作

总结

在鸿蒙系统中,实现跨设备协作任务并不复杂,关键在于思路要对

简单归纳就是:

  • 用分布式软总线解决设备问题
  • 用 Ability 迁移解决任务流转
  • 用分布式数据解决状态同步

当你把多个设备当成“一台设备的不同模块”,
跨设备协作就会变成一件很自然的事情。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐