第6章 多设备开发

173 阅读3分钟

6.1 分布式能力简介

HarmonyOS 最大的特色是 分布式架构

  • 一次开发,多端运行:写一个应用,可以运行在手机、平板、手表、车机。
  • 跨设备流转:比如在手机上看视频,随手一划就能把视频投到电视继续播放。
  • 分布式数据与任务:多个设备之间可以共享数据、调用对方的硬件(例如:手机调用手表的心率传感器)。

📌 对开发者来说,鸿蒙提供的分布式特性主要体现在:

  1. 分布式 UI → 界面跨设备共享
  2. 分布式数据 → 数据多端同步
  3. 分布式任务调度 → 调用远端设备能力

6.2 分布式 UI(跨设备界面显示)

基本原理

  • 应用运行在某个设备上时,可以通过 跨设备迁移 把 UI 和状态转移到另一台设备。
  • 用户体验:在手机填写表单,走到客厅后,可以在平板继续填写。

📌 示例:路由迁移到另一设备

import distributeMissionManager from '@ohos.distributedschedule.distributemissionmanager';

// 迁移任务到另一台设备
function continueOnDevice(deviceId: string, missionId: number) {
  distributeMissionManager.continueMission(deviceId, missionId, (err, data) => {
    if (err) {
      console.error("任务迁移失败:", err);
    } else {
      console.log("任务迁移成功:", data);
    }
  });
}

6.3 分布式数据

鸿蒙提供 分布式数据管理 (DDM) 模块,用来同步不同设备间的数据。

KVStore(键值对存储)

  • 多设备共享数据
  • 自动同步

📌 示例:

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

// 获取分布式 KVStore
async function initKVStore() {
  let manager = distributedData.createDistributedKVStoreManager("myApp");
  let kvStore = await manager.getKVStore("userStore", { encrypt: false, autoSync: true });
  
  // 写入数据(会自动同步到其他设备)
  await kvStore.put("username", "eric");

  // 读取数据
  let value = await kvStore.get("username");
  console.log("当前用户:", value);
}

6.4 分布式任务调度

原理

  • 鸿蒙支持跨设备调用任务,例如:

    • 手机调用电视播放视频
    • 平板调用手机的摄像头拍照

📌 示例:启动远程 Ability

import rpc from '@ohos.rpc';
import abilityManager from '@ohos.app.ability.abilityManager';

let want = {
  deviceId: "目标设备ID",
  bundleName: "com.example.app",
  abilityName: "RemoteAbility"
};

abilityManager.startAbility(want).then(() => {
  console.log("远程 Ability 启动成功");
}).catch((err) => {
  console.error("启动失败:", err);
});

6.5 设备发现与连接

要实现分布式能力,设备之间需要先互相“发现”和“认证”。

📌 示例:获取可用设备列表

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

// 获取设备列表
async function getDevices() {
  let dm = await deviceManager.createDeviceManager("myApp");
  let devices = dm.getTrustedDeviceListSync();
  console.log("已配对设备:", devices);
}

6.6 实操:手机控制平板显示相同界面

功能需求

  • 在手机上显示一个计数器(+1 / -1)。
  • 手机和平板共享同一个计数值。
  • 在任意设备操作都会同步更新。

代码:counter.ets

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

@Entry
@Component
struct DistributedCounter {
  @State count: number = 0
  private kvStore: any

  async aboutToAppear() {
    let manager = distributedData.createDistributedKVStoreManager("counterApp");
    this.kvStore = await manager.getKVStore("counterStore", { autoSync: true });
    
    // 读取初始值
    let value = await this.kvStore.get("count");
    this.count = value ? parseInt(value) : 0;

    // 监听数据变化(跨设备同步)
    this.kvStore.on("dataChange", (data) => {
      if (data.key === "count") {
        this.count = parseInt(data.value.value);
      }
    });
  }

  updateCount(delta: number) {
    this.count += delta;
    this.kvStore.put("count", this.count.toString());
  }

  build() {
    Column({ space: 20, alignItems: HorizontalAlign.Center }) {
      Text(`分布式计数器:${this.count}`)
        .fontSize(28)
        .fontWeight(FontWeight.Bold)

      Row({ space: 20 }) {
        Button("-1").onClick(() => this.updateCount(-1))
        Button("+1").onClick(() => this.updateCount(1))
      }
    }
    .width("100%")
    .height("100%")
    .backgroundColor("#F5F5F5")
  }
}

运行效果

  • 手机和平板同时运行这个应用。
  • 在手机点击 +1 → 平板界面同步更新。
  • 在平板点击 -1 → 手机界面同步更新。

✅ 到这里,你已经掌握了:

  • 分布式能力的概念
  • 分布式 UI(跨设备迁移)
  • 分布式数据(KVStore)
  • 分布式任务调度(远程调用)
  • 设备发现与连接
  • 实战:分布式计数器