6.1 分布式能力简介
HarmonyOS 最大的特色是 分布式架构:
- 一次开发,多端运行:写一个应用,可以运行在手机、平板、手表、车机。
- 跨设备流转:比如在手机上看视频,随手一划就能把视频投到电视继续播放。
- 分布式数据与任务:多个设备之间可以共享数据、调用对方的硬件(例如:手机调用手表的心率传感器)。
📌 对开发者来说,鸿蒙提供的分布式特性主要体现在:
- 分布式 UI → 界面跨设备共享
- 分布式数据 → 数据多端同步
- 分布式任务调度 → 调用远端设备能力
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)
- 分布式任务调度(远程调用)
- 设备发现与连接
- 实战:分布式计数器