HarmonyOS鸿蒙Next中显式Want跳转切换应用链接跳转适配指导提问

HarmonyOS鸿蒙Next中显式Want跳转切换应用链接跳转适配指导提问 指南链接 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-startup-adjust

这里没有提到对于want里flags参数如何处理

7 回复

尊敬的开发者,您好!感谢您的反馈,问题正在加速处理中,还请关注后续版本,感谢您的理解与支持。

更多关于HarmonyOS鸿蒙Next中显式Want跳转切换应用链接跳转适配指导提问的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


openLink 的 OpenLinkOptions 中确实没有 flags 参数,官方文档未提及是因为该接口本身就不支持传入启动标志位。

根据 OpenHarmony 官方接口文档,OpenLinkOptions 仅包含两个属性:就是appLinkingOnly和parameters,前面那个的类型是boolean,后面的是Record<string, Object>没有 flags 字段。

因为openLink 是 API 12 引入的高阶封装接口,其设计目的是替代显式 Want 拉起三方应用。系统内部已经基于隐式 Want 匹配规则完成了目标应用的选择和启动,开发者只需提供标准 URL 和少量选项,无需(也无法)干预底层的 Ability 启动标志。这与旧版的 startAbility(want) 有本质区别

如果你业务确实依赖flags的话:

场景 1:需要 FLAG_ABILITY_NEW_MISSION 等启动模式

openLink 内部由系统调度,任务栈行为由系统根据 App Linking / Deep Link 规则自动管理。若你强依赖新建 Mission(任务栈)等行为,目前没有直接等价方案。

替代思路:

若目标应用是同应用内的不同 Ability,可继续使用 startAbility(应用内跳转不受影响)。

若目标应用是系统应用(如浏览器、应用市场),同样可用 startAbility + Want 的 flags。

若目标应用是三方应用,API 12 后官方不推荐显式 Want 跳转,建议通过应用链接协商任务栈行为,或在华为开发者论坛提需求。

场景 2:需要 FLAG_AUTH_READ_URI_PERMISSION / FLAG_AUTH_WRITE_URI_PERMISSION

这类权限标志通常用于 startAbility 配合 uri 进行文件授权。使用 openLink 时:

敏感数据不应通过 URL 参数传递,官方建议放入 parameters 中。

若涉及文件跨应用共享,可能需要改用 URI 权限委托或其他鸿蒙安全机制(如 fileAccess),而非依赖 Want 的 flags。

四、迁移建议

如果你正在从 startAbility 迁移到 openLink,原 want.flags 的逻辑需要按场景拆分:

// ❌ 旧代码:通过 flags 控制启动行为
const want: Want = {
  bundleName: 'com.example.target',
  abilityName: 'EntryAbility',
  flags: wantConstant.Flags.FLAG_ABILITY_NEW_MISSION,
  parameters: { key: 'value' }
};
context.startAbility(want);

// ✅ 新代码:openLink 仅保留业务参数
const openLinkOptions: OpenLinkOptions = {
  appLinkingOnly: false,
  parameters: { key: 'value' } // 仅保留业务参数
};
context.openLink('https://www.example.com', openLinkOptions);

总的来说就是总结: 官方适配指导文档没有提到 flags,是因为 openLink 的 API 设计就不包含该参数。如果现有业务对 flags 有强依赖,且目标为三方应用,目前鸿蒙并未提供等效的 openLink 替代方案,需要评估是否保留 startAbility(应用内/系统应用场景)或调整交互设计。

指南里有些能力没有介绍。可以配合API参考来查文档。

《Want Flags》

使用Want的地方比如这样

try {
  let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  await context.startAbility({
    bundleName: 'com.huawei.hmos.settings',
    abilityName: 'com.huawei.hmos.settings.MainAbility',
    uri: 'air_share', 
    flags:wantConstant.Flags.FLAG_AUTH_PERSISTABLE_URI_PERMISSION
  });
} catch (error) {
  console.error('跳转设置页面失败:', (error as BusinessError).message);
}

flags : 表示处理Want的方式。值为枚举类型Flags

FLAG 说明
FLAG_AUTH_READ_URI_PERMISSION 0x00000001 表示临时授予接收方读取该URI指向的数据的权限。
元服务API:从API version 11开始,该接口支持在元服务中使用。
FLAG_AUTH_WRITE_URI_PERMISSION 0x00000002 表示临时授予接收方写入该URI指向的数据的权限。
元服务API:从API version 11开始,该接口支持在元服务中使用。
FLAG_AUTH_PERSISTABLE_URI_PERMISSION 0x00000040 表示该URI可被接收方持久化。目标应用可以通过fileShare.persistPermission接口进行权限持久化。
FLAG_INSTALL_ON_DEMAND 0x00000800 表示拉起元服务时开启免安装功能。
- 如果开启了免安装功能,当系统检测到被拉起的元服务未安装时,会自动安装元服务,再进行拉起。
- 如果未开启免安装功能,当元服务未安装时,将拉起失败。
元服务API:从API version 11开始,该接口支持在元服务中使用。
FLAG_START_WITHOUT_TIPS 0x40000000 表示是否关闭匹配失败弹窗功能。
通过隐式方式拉起应用时,如果没有能够匹配的应用,默认会弹出提示弹窗“暂无可用打开方式”。开发者可以通过该字段屏蔽该弹窗。
FLAG_ABILITY_ON_COLLABORATE 0x00002000 在多设备协同场景下,调用方应用通过DMS系统发起请求并且通过Flags字段携带此标志,协同方应用才会触发生命周期回调方法onCollaborate()

拉起文件处理类应用示例:

// xxx.ets
export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: window.WindowStage) {
        // 获取文件沙箱路径
        let filePath = this.context.filesDir + '/test.txt';
        // 将沙箱路径转换为uri
        let uri = fileUri.getUriFromPath(filePath);
        // 构造请求数据
        let want: Want = {
        action: 'ohos.want.action.viewData', // 表示查看数据的操作,文件打开场景固定为此值
        uri: uri,
        type: 'general.plain-text', // 表示待打开文件的类型
        // 配置被分享文件的读写权限,例如对文件打开应用进行读写授权
        flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION
        };
        // 调用接口启动
        this.context.startAbility(want)
        .then(() => {
            console.info('Succeed to invoke startAbility.');
        })
        .catch((err: BusinessError) => {
            console.error(`Failed to invoke startAbility, code: ${err.code}, message: ${err.message}`);
        });
    }
    // ...
}

在HarmonyOS Next中,显式Want跳转需通过指定bundleName和abilityName实现应用间切换。链接跳转适配时,使用openLink接口(API 12+)或Want的uri属性,需在module.json5中配置actions与uris。显式Want的IntentFlags建议设置ABILITY_INSTANCES_MULTI以支持多实例。调用startAbility时确保目标应用已安装。

在显式 Want 跳转切换为应用链接(OpenLink/DeepLink)的场景中,Want 的 flags 参数与原先 API 保持一致,无需额外适配。系统在解析应用链接后生成的 Want 已经自动携带了合适的 flags(如 FLAG_ABILITY_NEW_MISSION 等),开发者若通过显式 Want 自定义 flags,仍可按需添加,行为与之前相同。官方指南未单独说明,正是因为该参数在当前适配中没有行为变化,按原有方式使用即可。

回到顶部