协同和接续
时间: 2026-04-11 16:58:46
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
两段代码的核心区别
| 维度 | 第一段(迁移场景) | 第二段(协同场景) |
|---|---|---|
| 触发方式 | 系统自动触发(应用接续) | 主动调用 startAbilityByCall() |
| 使用场景 | 应用跨设备迁移(如文档编辑接续) | 多设备协同(如遥控器控制电视) |
| 数据传递 | 通过 wantParam 传递 sessionId | 通过 startAbilityByCall 传递 sessionId |
| 关键API | onContinue() + save() | startAbilityByCall() + Caller |
| 数据恢复 | 监听 'restored' 状态 | 监听 'change' 事件 |
| 文件迁移 | ✅ 支持 Asset 文件迁移 | ❌ 不支持文件,只传数据 |
| Ability 启动 | 系统自动拉起目标 Ability | 手动调用拉起 |
详细对比
1. 使用场景不同
第一段:跨设备迁移(Migration)
- 用户点击“应用接续”按钮,或系统触发迁移
- 典型场景:手机正在写文档,平板上继续编辑
- 数据会持久化保存,应用退出后重启仍能恢复
第二段:多设备协同(Collaboration)
- 应用主动调用 startAbilityByCall 拉起远端 Ability
- 典型场景:手机作为遥控器控制电视上的应用
- 数据不持久化,断开连接后数据丢失
2. 数据传递机制不同
第一段(迁移):
// 源设备:sessionId 通过 wantParam 传递 wantParam.distributedSessionId = sessionId; dataObject.save(deviceId); // 主动保存到目标设备
// 目标设备:从 want.parameters 取出 let sessionId = want.parameters.distributedSessionId; dataObject.setSessionId(sessionId);
第二段(协同):
// 主设备:sessionId 通过 want 传递 want.parameters.distributedSessionId = sessionId; context.startAbilityByCall(want);
// 被调用设备:从 want.parameters 取出 let sessionId = want.parameters.distributedSessionId; dataObject.setSessionId(sessionId);
3. 状态监听不同
第一段(迁移):
// 监听 'restored' 状态(数据恢复完成)
dataObject.on('status', (sessionId, networkId, status) => {
if (status == 'restored') {
// 数据已从源设备迁移过来
}
});第二段(协同):
// 监听 'change' 事件(数据实时变化)
dataObject.on('change', (sessionId, fields) => {
fields.forEach(field => {
console.log(${field}: ${dataObject[field]});
});
});4. 文件支持不同
第一段(迁移):
- ✅ 支持 Asset 文件迁移(图片、文档等)
- 文件需要放在 distributedFilesDir 目录
- 文件会随数据一起传输到目标设备
第二段(协同):
- ❌ 不支持文件迁移
- 只传输结构化数据(字符串、数字等)
5. Ability 生命周期要求不同
第一段(迁移):
// module.json5 必须设置
{
"abilities": [{
"continuable": true // 必须开启
}]
}第二段(协同):
// module.json5 必须设置
{
"abilities": [{
"launchType": "singleton" // 必须是单实例
}]
}你的场景应该用哪个?
根据你之前的描述(任意页面实时同步数据),你需要的不是迁移,也不是协同,而是:
纯粹的分布式数据同步 → 用 KVStore
因为你不需要:
- 跨设备拉起 Ability
- 应用接续的生命周期管理
- 文件迁移
你只需要:
- 两台设备同时打开 App
- 实时同步文本数据
KVStore 最适合你,它不需要 onContinue、不需要 startAbilityByCall,只要设备组网成功,数据自动同步。