在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

HarmonyOS 的分布式能力允许同一账号下的多设备(手机、平板、车机等)在应用层协同:例如在平板上继续手机上的任务、把内容投到智慧屏、多设备数据同步等。开发侧主要接触的是「分布式组网与发现」「跨设备调用」等能力,涉及安全与权限,用不对容易「发现不到设备」或「调用失败」。

本文只讲分布式能力中的设备发现、跨设备调用(如 FA 启动)的核心思路和关键 API,不贴完整 Demo。

分布式能力概述

分布式能力依赖以下前提:

  • 设备已登录同一华为账号
  • 设备间通过局域网或蓝牙等完成发现与认证
  • 应用在 module.json5 中声明了分布式相关权限与能力

开发时通常不会直接操作「组网」,而是使用系统提供的「设备列表」「跨设备启动/调用」等 API,在已组网的前提下完成业务逻辑。

设备发现与列表

应用需要「可选设备列表」时(如选择把内容投到哪台电视),可使用 @ohos.distributedDeviceManager 等模块查询当前可用的协同设备。注意:设备列表由系统维护,只包含已组网、且对当前应用可见的设备。

获取设备列表(示例思路):

import distributedDeviceManager from '@ohos.distributedDeviceManager'

const deviceManager = distributedDeviceManager.createDeviceManager('com.example.app')

deviceManager.getAvailableDeviceListSync()
  .then((devices: distributedDeviceManager.DeviceBasicInfo[]) => {
    // devices 为当前可用的协同设备列表
    // 每项包含 deviceId、deviceName、deviceType 等
    devices.forEach((d) => {
      console.info(d.deviceId, d.deviceName)
    })
  })
  .catch((err: BusinessError) => {
    console.error('getAvailableDeviceListSync failed', err)
  })

要点:

  • createDeviceManager 的入参一般为 bundleName,用于标识调用方,需与当前应用一致。
  • 返回的 deviceId 用于后续「跨设备启动 FA」「跨设备调用」等,不要当作持久化唯一标识,可能随网络变化。

具体 API 名(如 getAvailableDeviceListSync / getTrustedDeviceListSync)以当前版本文档为准,有的版本可能为异步回调形式。

跨设备启动 FA

FA(Feature Ability)在 HarmonyOS 中对应一个可被调起的界面或能力。跨设备启动 FA 指:在当前设备上,通过指定「目标 deviceId + bundleName + abilityName」在另一台设备上拉起该 FA。

启动远程 FA(示例思路):

import Want from '@ohos.app.ability.Want'
import common from '@ohos.app.ability.common'

const want: Want = {
  deviceId: '目标设备 ID',  // 从设备列表获取
  bundleName: 'com.example.app',
  abilityName: 'EntryAbility',
  uri: 'detail',
  parameters: {
    id: 100
  }
}

const context = getContext(this) as common.UIAbilityContext
context.startAbility(want)
  .then(() => {
    console.info('startAbility success')
  })
  .catch((err: BusinessError) => {
    console.error('startAbility failed', err)
  })

要点:

  • deviceId:必须是当前分布式组网内可用设备的 ID,否则会失败。
  • bundleName / abilityName:目标设备上已安装应用的包名与 Ability 名,需与目标应用配置一致。
  • parameters:可选,用于传参;目标端在 Ability 的 onCreate 或相关回调里通过 Want 取参。

跨设备启动前,建议先通过设备列表确认目标设备可用,再构造 Want 并 startAbility。

分布式数据与同步

若要在多设备间同步少量数据(如配置、草稿),可使用分布式数据库(如 @ohos.data.distributedData)。思路是:创建 KV 或关系型分布式 store,在本地读写,由系统在后台按策略同步到同账号其他设备。

注意:

  • 分布式库有冲突策略(如最后写入获胜)、同步延迟,适合「最终一致」场景,不适合强一致或实时性极高的数据。
  • 需要在 module.json5 中声明分布式数据权限,并可能需要在设置中由用户开启「多设备协同」等开关。

具体 API(createKVStore、put/get、注册同步回调等)以当前文档为准,使用时要处理好「本地先可用、远端延迟同步」的体验。

权限与配置

分布式能力通常需要在 module.json5 中声明:

  • 权限:如 ohos.permission.DISTRIBUTED_DATASYNC、设备发现相关权限等,部分需用户授权。
  • Ability 的 export:若希望本应用的 Ability 可被其他设备拉起,需在对应 ability 中配置 exported: true 等。

未正确声明时,设备列表可能为空或跨设备启动失败,需结合文档和错误码排查。

总结

  • 设备发现:通过 DeviceManager 获取当前可用协同设备列表,得到 deviceId 供后续使用。
  • 跨设备启动:构造带 deviceId、bundleName、abilityName 的 Want,用 startAbility 在目标设备上拉起 FA,参数通过 Want 传递。
  • 分布式数据:使用分布式数据库做多设备数据同步,需注意一致性与权限配置。

分布式能力依赖账号与组网环境,开发和测试时建议使用多台已登录同账号的真机或模拟器,按文档完成权限与配置后再联调。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐