大家好,我 V 哥。很多兄弟觉得跨设备开发高不可攀,但在鸿蒙6.0里,分布式任务调度就是底层基础设施。手机、平板、智慧屏之间互相调任务,真的就是跟玩似的。今天V哥带你扒一扒这玩意的核心API,看完直接拿去实战。
这玩意儿到底能干啥?
别光听我吹,这东西就四板斧,但招招致命:
- 找设备:自动发现局域网内的兄弟设备并完成认证。
- 拉任务:我在手机上点一下,直接把你智慧屏的摄像头拉起来。
- 无缝迁移:手机上看到一半的视频,一键甩到平板上接着播。
- 传数据:跨设备的状态同步,不用你再去写复杂的Socket。
核心代码:发现与启动
别一上来就看迁移,先搞懂怎么找设备、怎么拉起远程任务。注意看代码里的细节,V哥做了设备过滤和参数传递:
typescript
import distributedSchedule from '@ohos.distributedSchedule';
// 1. 获取可用设备列表(只找在线的智慧屏)
async function getAvailableDevices() {
const devices = await distributedSchedule.getDistributedDevices();
// 过滤出在线的智慧屏设备
const onlineDevices = devices.filter(d => d.isOnline && d.deviceType === 'smartScreen');
console.log('V哥发现可用设备:', JSON.stringify(onlineDevices));
return onlineDevices;
}
// 2. 启动远程任务(注意:deviceId得从上面拿,不能瞎写)
async function startRemoteCamera(deviceId: string) {
const options = {
bundleName: 'com.example.camera',
abilityName: 'CameraAbility',
deviceId: deviceId, // 真实的远程设备ID
parameters: {
mode: 'video',
resolution: '1080p',
filter: 'beauty' // 顺手把美颜参数传过去
}
};
const result = await distributedSchedule.startRemoteTask(options);
console.log('远程任务启动成功,TaskID:', result.taskId);
return result;
}
实战案例:别背 API,看场景
场景一:手机一键当智慧屏摄像头
很多人写Demo喜欢把代码拆开,运行起来全是Bug。看V哥怎么写完整闭环:
typescript
async function demoStartRemoteCamera() {
// 第一步:找设备
const devices = await getAvailableDevices();
if (devices.length === 0) {
console.error('没找到智慧屏,收工!');
return;
}
// 第二步:拿第一台设备的ID,直接拉起任务
const targetDevice = devices[0];
await startRemoteCamera(targetDevice.deviceId);
}
场景二:任务无缝迁移
想把当前页面甩到别的设备上?用 continueTask。别搞那么多花里胡哨的,看核心调用:
typescript
// 将当前设备的任务迁移到目标设备
async function continueTaskToRemote(targetDeviceId: string) {
try {
await distributedSchedule.continueTask({
sourceDeviceId: getLocalDeviceId(), // 本机ID
targetDeviceId: targetDeviceId, // 目标机ID
abilityName: 'DetailAbility', // 要迁移的页面/Ability
parameters: {
videoProgress: '15:30', // 把进度条状态带过去
isPlaying: true
}
});
console.log('迁移成功,本机可以退后台了');
} catch (err) {
console.error('迁移翻车了:', err);
}
}
场景三:不想迁移页面,只想同步数据?
有时候我不需要拉起界面,我只想两台设备共享个数据状态,用分布式数据管理:
typescript
import dataShare from '@ohos.dataShare';
class CrossDeviceDataManager {
private dataSession: dataShare.DataShareSession;
// 建立跨设备的数据通道
async createSharedSession(deviceId: string) {
this.dataSession = await dataShare.createSession({
sessionName: 'vgod_shared_data',
devices: [getLocalDeviceId(), deviceId],
dataType: 'keyValue'
});
}
// 写入数据,另一台设备立马能收到
async writeSharedData(key: string, value: Object) {
await this.dataSession.insert(key, value);
}
// 监听数据变化
onDataChange(callback: (key: string, value: Object) => void) {
this.dataSession.on('dataChange', callback);
}
}
⚠️ 高能预警:配权限!
很多新手代码写得贼溜,一跑直接崩,一看日志------没配权限。把这段老老实实塞进你的 module.json5 里:
json
{
"module": {
"distributionFilter": {
"supports": ["phone", "tablet", "smartScreen", "watch"]
},
"requestPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DEVICE_STATE",
"reason": "$string:distributed_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
},
{
"name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO",
"reason": "$string:distributed_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
}
]
}
}
(V哥注:发现设备信息通常还需要 GET_DISTRIBUTED_DEVICE_INFO 权限,给你补上了,免得踩坑。)
最后 :
这API设计得是真的克制又强大。以前搞跨端通信,各种协议、各种心跳包能让人掉光头发,现在鸿蒙把底层全给你封装好了,几行代码搞定跨设备调度。就这开发效率,还要什么自行车?
觉得有用?点赞收藏,下期V哥带你们搞更炸裂的鸿蒙底层机制!