Qt for HarmonyOS/user development/application continuation guild zh: Difference between revisions
Jump to navigation
Jump to search
(Created page with "== 简介 == HarmonyOS 平台支持多进程架构,Qt 通过 '''startNoUiChildProcess''' API 为开发者提供了创建无 UI 子进程并传递启动参数的能力。本指南将详细说明该功能的使用方法、部署步骤,并提供完整的代码示例。 == 功能架构概述 == 在 HarmonyOS 中使用 Qt 子进程功能时,可以参考以下架构原则: * '''主应用进程''' ** 负责 UI 交互和用户界面 ** 通过 QtOhosExtras 模块调...") |
No edit summary |
||
| Line 1: | Line 1: | ||
= Qt for HarmonyOS 应用接续开发指南 = | |||
== 简介 == | == 简介 == | ||
本文面向 Qt 开发者,介绍如何在 HarmonyOS 上实现“应用接续”(跨设备迁移应用状态)。 | |||
HarmonyOS | QtOhosExtras 模块已封装 HarmonyOS 的 onContinue / onNewWant 等流程,开发者仅需使用 Qt 接口完成迁移请求、数据封装与目标端恢复。 | ||
---- | |||
== | == 能力与模块 == | ||
=== 能力 === | |||
* 在设备间迁移当前应用状态 | |||
* 支持快速预热(ContinueQuickStart) | |||
* 支持源端保留 / 退出策略控制 | |||
=== 模块 === | |||
* 模块名:<code>qtohosextras</code> | |||
* 核心类: | |||
** <code>QOhosAbilityContext</code> | |||
** <code>QOhosOnContinueContext</code> | |||
** <code>QOhosWantInfo</code> | |||
* 工具函数: | |||
** <code>QtOhosExtras::tryGetOnContinueData</code> | |||
== | === 数据通道限制 === | ||
* 小于 100KB:通过 Want parameters 携带 | |||
** 数据类型:Base64 的 <code>QByteArray</code> | |||
** 键名:<code>__io_qt_on_continue_migration_data</code> | |||
* 大于 100KB:Qt 暂未实现,将在后续版本提供 | |||
---- | |||
== 工作流程 == | |||
< | # 源端收到迁移请求(<code>continueRequestReceived</code>) | ||
#* 序列化业务状态(<100KB) | |||
#* 同意 / 拒绝 / 版本不匹配响应 | |||
#* 按需决定源端是否退出 | |||
) | # 目标端收到 Want(冷启动或热启动) | ||
</ | #* 使用 <code>tryGetOnContinueData()</code> 提取迁移数据 | ||
#* 反序列化并恢复 UI 状态 | |||
# 可选能力 | |||
#* 配置 ContinueQuickStart 快速预热 | |||
#* 动态开关迁移能力 | |||
#* 控制源端保留 / 退出策略 | |||
---- | |||
== 核心 API 速览 == | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! API / 信号 !! 说明 | ||
|- | |||
| <code>QOhosAbilityContext::continueRequestReceived</code> || 源端接收迁移请求的信号 | |||
|- | |||
| <code>QOhosOnContinueContext</code> || 同意/拒绝/版本不匹配响应;设置源端退出策略 | |||
|- | |||
| <code>QOhosAbilityContext::newWantInfoReceived</code> || 目标端运行时接收新 Want 的信号 | |||
|- | |||
| <code>QOhosWantInfo::launchReason()</code> || 启动原因:StartAbility / PrepareContinuation / Continuation | |||
|- | |- | ||
| <code> | | <code>QtOhosExtras::tryGetOnContinueData(const QOhosWant &want)</code> || 提取迁移数据(返回 <code>QSharedPointer<QByteArray></code>) | ||
|- | |- | ||
| <code> | | <code>QOhosAbilityContext::setContinuationActive(bool)</code> || 动态开关迁移能力 | ||
|- | |||
| <code>QOhosOnContinueContext::setExitAppOnSourceDeviceAfterMigration(bool)</code> || 控制源端迁移成功后是否退出 | |||
|} | |} | ||
---- | |||
== 源端实现(发起迁移) == | |||
=== 实现步骤 === | |||
# 监听迁移请求:<code>continueRequestReceived</code> | |||
# 校验版本/业务条件:<code>ctx->sourceApplicationVersionCode()</code> | |||
# 序列化状态(<100KB)并响应: | |||
#* 同意:<code>setAgreeResponse(serialized)</code> | |||
#* 版本不匹配:<code>setMismatchResponse()</code> | |||
#* 拒绝:<code>setRejectResponse()</code> | |||
# 是否保留源端: | |||
#* <code>setExitAppOnSourceDeviceAfterMigration(false)</code>(默认 true) | |||
# 按需开/关迁移: | |||
#* <code>setContinuationActive(bool)</code> | |||
=== 示例:同意迁移并保留源端 === | |||
<syntaxhighlight lang="cpp"> | |||
auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle()); | |||
if ( | QObject::connect(ability.get(), &QOhosUiAbilityContext::continueRequestReceived, | ||
[](auto ctx) { | |||
// | auto appVersion = QOhosAppContext::instance()->getBundleInfo()->versionCode(); | ||
} else | if (ctx->sourceApplicationVersionCode() == appVersion) { | ||
QByteArray payload = /* serialize state (<100KB) */; | |||
ctx->setAgreeResponse(payload); | |||
ctx->setExitAppOnSourceDeviceAfterMigration(false); // keep source | |||
} else { | |||
ctx->setMismatchResponse(); | |||
} | } | ||
} | }); | ||
</syntaxhighlight> | |||
</ | |||
'''参考:''' <code>examples/qtohosextras/applicationcontinuation/main.cpp</code> | |||
---- | |||
== | == 目标端实现(接收与恢复) == | ||
=== 实现步骤 === | |||
< | # 冷启动获取: | ||
# | #* <code>auto wantInfo = QOhosAppContext::getAppLaunchWantInfo();</code> | ||
# | # 运行时获取: | ||
# | #* 监听 <code>QOhosAbilityContext::newWantInfoReceived</code> | ||
# | # 场景区分: | ||
#* <code>launchReason()</code> == <code>PrepareContinuation</code>(预热) | |||
#* <code>launchReason()</code> == <code>Continuation</code>(正式迁移数据) | |||
# 提取数据: | |||
#* <code>auto data = QtOhosExtras::tryGetOnContinueData(wantInfo->want());</code> | |||
# 恢复状态: | |||
#* 反序列化 <code>data</code>,还原业务状态并刷新 UI | |||
=== 示例:冷启动 + 热启动恢复 === | |||
: | <syntaxhighlight lang="cpp"> | ||
// Cold start | |||
{ | if (auto launchInfo = QOhosAppContext::getAppLaunchWantInfo()) { | ||
auto data = QtOhosExtras::tryGetOnContinueData(launchInfo->want()); | |||
if (data) { /* deserialize and restore */ } | |||
} | } | ||
// Hot start | |||
{ | auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle()); | ||
QObject::connect(ability.get(), &QOhosUiAbilityContext::newWantInfoReceived, | |||
[](const QSharedPointer<QOhosWantInfo> &info) { | |||
if (info->launchReason() == QOhosWantInfo::LaunchReason::Continuation) { | |||
auto data = QtOhosExtras::tryGetOnContinueData(info->want()); | |||
if (data) { /* deserialize and restore */ } | |||
} | |||
}); | |||
</syntaxhighlight> | |||
---- | |||
== 快速预热(ContinueQuickStart) == | |||
=== 适用场景 === | |||
希望目标端先拉起/预热,数据到达后再恢复业务状态。 | |||
=== 配置方式 === | |||
在 <code>module.json5</code> 中,将目标 Ability 的 <code>continueType</code> 末尾添加: | |||
</ | * <code>_ContinueQuickStart</code> | ||
=== | === 流程说明 === | ||
* 首先触发 <code>PrepareContinuation</code>(预热) | |||
* 随后触发 <code>Continuation</code>(正式数据) | |||
=== 示例:区分预热/正式 === | |||
< | <syntaxhighlight lang="cpp"> | ||
QObject::connect(ability.get(), &QOhosUiAbilityContext::newWantInfoReceived, | |||
[](const QSharedPointer<QOhosWantInfo> &info) { | |||
switch (info->launchReason()) { | |||
case QOhosWantInfo::LaunchReason::PrepareContinuation: | |||
// Warm-up / placeholder | |||
break; | |||
case QOhosWantInfo::LaunchReason::Continuation: { | |||
auto data = QtOhosExtras::tryGetOnContinueData(info->want()); | |||
if (data) { /* deserialize and restore */ } | |||
break; | |||
} | |||
default: | |||
break; | |||
} | |||
}); | |||
</syntaxhighlight> | |||
---- | |||
== 动态开关迁移 == | |||
=== 适用场景 === | |||
特定页面不允许迁移时关闭,需要迁移前再开启。 | |||
== | === 接口 === | ||
<code>QOhosAbilityContext::setContinuationActive(bool)</code>(默认开启) | |||
=== | === 示例 === | ||
<syntaxhighlight lang="cpp"> | |||
auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle()); | |||
ability->setContinuationActive(false); // disable | |||
ability->setContinuationActive(true); // enable when needed | |||
</syntaxhighlight> | |||
---- | |||
== 源端退出策略 == | |||
=== 说明 === | |||
默认情况下,迁移成功后系统会关闭源端;调试或需要保留源端时可将其设置为 false。 | |||
=== 接口 === | |||
<code>QOhosOnContinueContext::setExitAppOnSourceDeviceAfterMigration(bool)</code> | |||
</ | |||
=== | === 示例:同意迁移但保留源端 === | ||
<syntaxhighlight lang="cpp"> | |||
QObject::connect(ability.get(), &QOhosUiAbilityContext::continueRequestReceived, | |||
[](auto ctx) { | |||
< | auto appVersion = QOhosAppContext::instance()->getBundleInfo()->versionCode(); | ||
if (ctx->sourceApplicationVersionCode() == appVersion) { | |||
ctx->setAgreeResponse(QByteArray("Migration Test Data")); | |||
ctx->setExitAppOnSourceDeviceAfterMigration(false); | |||
} else { | |||
ctx->setMismatchResponse(); | |||
} | |||
}); | |||
</syntaxhighlight> | |||
</ | |||
---- | |||
== | == 快速上手清单 == | ||
# 源端:监听 <code>continueRequestReceived</code>,序列化数据 <100KB,调用 <code>setAgreeResponse</code> 或 mismatch/reject;按需设置退出策略与迁移开关。 | |||
# 目标端:通过 <code>launchReason()</code> 判定预热/正式;使用 <code>tryGetOnContinueData</code> 提取并恢复状态。 | |||
# 需要预热:配置 <code>continueType</code> 为 <code>_ContinueQuickStart</code>,在 <code>PrepareContinuation</code> 只做轻量处理。 | |||
---- | |||
== | == 参考路径 == | ||
* 示例:<code>qtohosextras/examples/qtohosextras/applicationcontinuation/main.cpp</code> | |||
* 实现:<code>qtohosextras/src/ohosextras/qohosabilitycontext.cpp/.h</code> | |||
* Want 定义:<code>qtohosextras/src/ohosextras/qohoswant.h</code> | |||
---- | |||
== | == 注意事项 == | ||
* 未响应迁移请求默认视为拒绝,请在回调中明确处理。 | |||
* | * 回调在 Qt 线程执行,避免跨线程操作 UI。 | ||
* 迁移数据需向前兼容,协议变更时携带版本并做好容错。 | |||
* Qt 暂未支持大于 100KB 数据的接续,将在未来版本中提供。 | |||
* 更多说明参考:HarmonyOS 应用接续官方指南(外部链接) | |||
Revision as of 07:07, 25 December 2025
Qt for HarmonyOS 应用接续开发指南
简介
本文面向 Qt 开发者,介绍如何在 HarmonyOS 上实现“应用接续”(跨设备迁移应用状态)。
QtOhosExtras 模块已封装 HarmonyOS 的 onContinue / onNewWant 等流程,开发者仅需使用 Qt 接口完成迁移请求、数据封装与目标端恢复。
能力与模块
能力
- 在设备间迁移当前应用状态
- 支持快速预热(ContinueQuickStart)
- 支持源端保留 / 退出策略控制
模块
- 模块名:
qtohosextras - 核心类:
QOhosAbilityContextQOhosOnContinueContextQOhosWantInfo
- 工具函数:
QtOhosExtras::tryGetOnContinueData
数据通道限制
- 小于 100KB:通过 Want parameters 携带
- 数据类型:Base64 的
QByteArray - 键名:
__io_qt_on_continue_migration_data
- 数据类型:Base64 的
- 大于 100KB:Qt 暂未实现,将在后续版本提供
工作流程
- 源端收到迁移请求()
continueRequestReceived- 序列化业务状态(<100KB)
- 同意 / 拒绝 / 版本不匹配响应
- 按需决定源端是否退出
- 目标端收到 Want(冷启动或热启动)
- 使用 提取迁移数据
tryGetOnContinueData()
- 反序列化并恢复 UI 状态
- 使用
- 可选能力
- 配置 ContinueQuickStart 快速预热
- 动态开关迁移能力
- 控制源端保留 / 退出策略
核心 API 速览
| API / 信号 | 说明 |
|---|---|
QOhosAbilityContext::continueRequestReceived
|
源端接收迁移请求的信号 |
QOhosOnContinueContext
|
同意/拒绝/版本不匹配响应;设置源端退出策略 |
QOhosAbilityContext::newWantInfoReceived
|
目标端运行时接收新 Want 的信号 |
QOhosWantInfo::launchReason()
|
启动原因:StartAbility / PrepareContinuation / Continuation |
QtOhosExtras::tryGetOnContinueData(const QOhosWant &want)
|
提取迁移数据(返回 QSharedPointer<QByteArray>
|
QOhosAbilityContext::setContinuationActive(bool)
|
动态开关迁移能力 |
QOhosOnContinueContext::setExitAppOnSourceDeviceAfterMigration(bool)
|
控制源端迁移成功后是否退出 |
源端实现(发起迁移)
实现步骤
- 监听迁移请求:
continueRequestReceived - 校验版本/业务条件:
ctx->sourceApplicationVersionCode()
- 序列化状态(<100KB)并响应:
- 同意:
setAgreeResponse(serialized)
- 版本不匹配:
setMismatchResponse()
- 拒绝:
setRejectResponse()
- 同意:
- 是否保留源端:
- (默认 true)
setExitAppOnSourceDeviceAfterMigration(false)
- 按需开/关迁移:
setContinuationActive(bool)
示例:同意迁移并保留源端
auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle());
QObject::connect(ability.get(), &QOhosUiAbilityContext::continueRequestReceived,
[](auto ctx) {
auto appVersion = QOhosAppContext::instance()->getBundleInfo()->versionCode();
if (ctx->sourceApplicationVersionCode() == appVersion) {
QByteArray payload = /* serialize state (<100KB) */;
ctx->setAgreeResponse(payload);
ctx->setExitAppOnSourceDeviceAfterMigration(false); // keep source
} else {
ctx->setMismatchResponse();
}
});
参考:
examples/qtohosextras/applicationcontinuation/main.cpp
目标端实现(接收与恢复)
实现步骤
- 冷启动获取:
auto wantInfo = QOhosAppContext::getAppLaunchWantInfo();
- 运行时获取:
- 监听
QOhosAbilityContext::newWantInfoReceived
- 监听
- 场景区分:
- ==
launchReason()
(预热)PrepareContinuation - ==
launchReason()
(正式迁移数据)Continuation
- 提取数据:
auto data = QtOhosExtras::tryGetOnContinueData(wantInfo->want());
- 恢复状态:
- 反序列化 ,还原业务状态并刷新 UI
data
- 反序列化
示例:冷启动 + 热启动恢复
// Cold start
if (auto launchInfo = QOhosAppContext::getAppLaunchWantInfo()) {
auto data = QtOhosExtras::tryGetOnContinueData(launchInfo->want());
if (data) { /* deserialize and restore */ }
}
// Hot start
auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle());
QObject::connect(ability.get(), &QOhosUiAbilityContext::newWantInfoReceived,
[](const QSharedPointer<QOhosWantInfo> &info) {
if (info->launchReason() == QOhosWantInfo::LaunchReason::Continuation) {
auto data = QtOhosExtras::tryGetOnContinueData(info->want());
if (data) { /* deserialize and restore */ }
}
});
快速预热(ContinueQuickStart)
适用场景
希望目标端先拉起/预热,数据到达后再恢复业务状态。
配置方式
在
module.json5
中,将目标 Ability 的
continueType
末尾添加:
_ContinueQuickStart
流程说明
- 首先触发 (预热)
PrepareContinuation - 随后触发 (正式数据)
Continuation
示例:区分预热/正式
QObject::connect(ability.get(), &QOhosUiAbilityContext::newWantInfoReceived,
[](const QSharedPointer<QOhosWantInfo> &info) {
switch (info->launchReason()) {
case QOhosWantInfo::LaunchReason::PrepareContinuation:
// Warm-up / placeholder
break;
case QOhosWantInfo::LaunchReason::Continuation: {
auto data = QtOhosExtras::tryGetOnContinueData(info->want());
if (data) { /* deserialize and restore */ }
break;
}
default:
break;
}
});
动态开关迁移
适用场景
特定页面不允许迁移时关闭,需要迁移前再开启。
接口
QOhosAbilityContext::setContinuationActive(bool)
(默认开启)
示例
auto ability = QOhosAbilityContext::getInstanceForMainWindow(window.windowHandle());
ability->setContinuationActive(false); // disable
ability->setContinuationActive(true); // enable when needed
源端退出策略
说明
默认情况下,迁移成功后系统会关闭源端;调试或需要保留源端时可将其设置为 false。
接口
QOhosOnContinueContext::setExitAppOnSourceDeviceAfterMigration(bool)
示例:同意迁移但保留源端
QObject::connect(ability.get(), &QOhosUiAbilityContext::continueRequestReceived,
[](auto ctx) {
auto appVersion = QOhosAppContext::instance()->getBundleInfo()->versionCode();
if (ctx->sourceApplicationVersionCode() == appVersion) {
ctx->setAgreeResponse(QByteArray("Migration Test Data"));
ctx->setExitAppOnSourceDeviceAfterMigration(false);
} else {
ctx->setMismatchResponse();
}
});
快速上手清单
- 源端:监听 ,序列化数据 <100KB,调用
continueRequestReceived或 mismatch/reject;按需设置退出策略与迁移开关。setAgreeResponse - 目标端:通过 判定预热/正式;使用
launchReason()
提取并恢复状态。tryGetOnContinueData - 需要预热:配置 为
continueType,在_ContinueQuickStart只做轻量处理。PrepareContinuation
参考路径
- 示例:
qtohosextras/examples/qtohosextras/applicationcontinuation/main.cpp
- 实现:
qtohosextras/src/ohosextras/qohosabilitycontext.cpp/.h
- Want 定义:
qtohosextras/src/ohosextras/qohoswant.h
注意事项
- 未响应迁移请求默认视为拒绝,请在回调中明确处理。
- 回调在 Qt 线程执行,避免跨线程操作 UI。
- 迁移数据需向前兼容,协议变更时携带版本并做好容错。
- Qt 暂未支持大于 100KB 数据的接续,将在未来版本中提供。
- 更多说明参考:HarmonyOS 应用接续官方指南(外部链接)