HarmonyOS鸿蒙Next中创建应用静态快捷方式可以动态配置吗?

HarmonyOS鸿蒙Next中创建应用静态快捷方式可以动态配置吗? 创建应用静态快捷方式可以像iOS那样让用户在应用内动态配置吗?自定义数目和顺序

12 回复

从 API version 20 开始通过 《shortcutManager模块》 是可以做到应用内配置的。

数目可以配置很多,但最多起作用和显示的只有前4个。顺序依赖 shortcuts_config 配置文件配置顺序。

主要思路和步骤如下:

  1. 配置 shortcuts_config.json 里 《shortcuts标签》 的 visible 属性,作为应用安装默认显示与否。

  2. 实现“快捷配置中心”页面,shortcutManager 管理快捷项的添加和移除。核心方法代码如下:

// shortId为配置文件中的shortcuts标签下实际配置的shortcutId字段
setShortStatus(shortId:string):void{
    if (deviceInfo.sdkApiVersion >= 20) {
      //TODO 根据shortId获取存储的status
      shortcutManager.setShortcutVisibleForSelf(shortId, !status)
        .then(() => {
          //TODO 存储status状态
        }).catch((err: BusinessError) => {
        console.error(`setShortcutVisibleForSelf errData is errCode:${err.code}  message:${err.message}`);
      });
    } else {
      // Fallback to an earlier version
    }
  }

优化体验:

① 在配置文件里第4个配置一个“添加更多快捷方式”项,这个跳转到快捷配置页面。

② 配合使用 《服务卡片Form Kit》(可直接跳转至非入口页面)

③ 配合使用 《桌面快捷方式》

希望帮得到你,实现时有问题再留言。如有用给个采纳。😊😊

更多关于HarmonyOS鸿蒙Next中创建应用静态快捷方式可以动态配置吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我又确认到一个细节:普通应用公开的 shortcutManager 主要是“查询/显示控制”,而“新增、删除、查询全部桌面快捷方式”的那套接口在文档里标了系统接口。这样基本可以回答你了。结论先说:

不能把“静态快捷方式”做成像 iOS 那样由用户在应用内自由动态配置数量和顺序。

原因

HarmonyOS 里的静态快捷方式本质上是工程配置项,是在 shortcuts_config.json 里预先声明,再通过 module.json5 关联上的,不是运行时让用户随意编辑的一类对象。官方“创建应用静态快捷方式”文档就是按这种方式配置的,而且还说明了桌面最多展示 4 个创建应用静态快捷方式

另外,公开的 shortcutManager 能力描述是“管理快捷方式是否显示等”,也就是偏查询/显隐控制;而“增加、删除、查询桌面快捷方式”那组接口在文档中标的是系统接口,不是普通应用通用开放能力。shortcutManager 模块说明 shortcutManager 系统接口说明

这意味着什么

如果你问的是:

1. 用户在应用里自己增减“静态快捷方式”数量

不行,静态快捷方式不是给用户运行时自由增删的。

2. 用户在应用里自己调整“静态快捷方式”顺序

通常也不行,至少不是 iOS 那种标准公开能力模型。 静态快捷方式的顺序本质上来自配置和系统展示策略,不是给应用开放一个运行时排序编辑器。

3. 应用能不能做一点“动态效果”

可以,但能力有限。

你现在能比较稳妥做的,通常是这类方案:

  • 预置一组静态快捷方式
  • 运行时根据场景隐藏/显示其中一部分
  • 或者改走动态快捷方式思路,而不是静态快捷方式

官方文档里也提到可以通过 setShortcutVisibleForSelf 去隐藏或展示快捷方式,这说明普通应用公开能力更偏“显隐控制”,不是完全自定义编辑。创建应用静态快捷方式

如果你想实现“接近 iOS”的体验

可以考虑两种替代思路:

方案一:预置多个静态快捷方式 + 显隐控制

适合:

  • 常用入口是固定集合
  • 只需要根据用户偏好显示其中几个

缺点:

  • 用户不能真正自由新增任意快捷项
  • 排序能力也受限

方案二:改做动态快捷方式

文档里 ShortcutInfo 已区分快捷方式类型,且提到从 API version 23 开始支持动态快捷方式ShortcutInfo 说明

但这里要注意:

  • “支持动态快捷方式”不等于“完全具备 iOS 那种用户端可视化自由编排能力”
  • 还要看你目标系统版本、公开 API、设备侧桌面实际支持情况

最终结论

一句话说:

静态快捷方式不能像 iOS 一样让用户在应用内动态自定义数目和顺序。 普通应用更适合做的是:

  • 静态快捷方式的预配置
  • 运行时显隐控制
  • 或在合适版本上研究动态快捷方式,而不是把“静态快捷方式”本身做成可编辑模型

补充修正一下:如果是“运行时任意创建/改名/改图标/改排序”的动态快捷方式,静态配置本身仍不适合;但从 API version 20 开始,可以用 @kit.AbilityKit 里的 shortcutManager.setShortcutVisibleForSelf(id, visible) 控制当前应用已配置快捷方式是否显示。

落地方式是:先在 module.json5/快捷方式配置里预置若干个候选 shortcut,并设置好 shortcutId、label、icon、want 和顺序;应用内做一个“快捷入口设置页”,保存用户选择后调用 setShortcutVisibleForSelf(shortcutId, true/false) 控制显示隐藏。

注意它控制的是“已配置快捷方式的可见性”,不是动态生成全新的长按菜单项,也不能动态改已配置项的文案和图标。若希望用户自定义内容更丰富,服务卡片会更适合;若是把某个功能单独加到桌面,再评估桌面快捷方式能力。

官方接口参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-shortcutmanager

听着就是不可以的,但是鸿蒙好像有自己的逻辑来增加卡片,鸿蒙5是两个,鸿蒙6是10个

方案1:静态只做"壳",实际逻辑用参数区分

  • 静态快捷方式里先固定配置4个入口(比如"快捷入口1/2/3/4")
  • 真正的业务逻辑,通过 parameters里传的参数来区分
  • 用户在应用内设置的顺序、功能,存在本地数据库里
  • 快捷方式被拉起时,根据参数去读用户配置,跳转到对应的页面
  • 缺点:没法改图标和文案,用户看不到自己设置的名称,体验差一点

方案2:用服务卡片(Form)来实现,更接近iOS的效果

这是官方推荐的替代方案,体验和能力都更好:

  • 卡片可以完全由应用控制,动态渲染内容、图标和跳转逻辑
  • 可以在应用内做设置,用户选择要展示的功能、调整顺序
  • 桌面的卡片会跟着用户设置实时刷新,每个卡片都能跳转到不同页面
  • 甚至可以做一个"自定义快捷栏"的卡片,用户自己拖顺序、开关功能

补充说明

HarmonyOS虽然有动态快捷方式的API,但大多是系统接口,普通应用拿不到权限,没法直接在桌面动态增删快捷方式图标。

如果指的是 module.json5 里配置的静态快捷方式,它随安装包配置生效,不适合做用户在应用内动态调整数量和顺序的入口。更稳的替代方案有两个:一是静态快捷方式只保留固定入口,点击后进入 Dispatcher 页面,再根据用户在应用内保存的偏好跳转;二是如果需求是把某个具体功能加到桌面,可以评估 AppGallery Kit 的快捷方式加桌能力,例如 checkPinShortcutPermitted 和 requestNewPinShortcut。

但这属于请求创建桌面快捷方式,不是修改长按图标菜单里的静态列表。

参考静态快捷方式文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/typical-scenario-configuration

简单直接的回答是:不可以。

根据图片中的问题描述,核心矛盾在于“静态”与“动态”的特性冲突。以下是对该问题的详细技术分析:

核心概念冲突

  • 静态快捷方式(Static Shortcuts):
    • 定义: 这种方式是在应用的安装包(如 Android 的 AndroidManifest.xml 或 iOS 的 Info.plist)中预先定义好的。
    • 特性: 它们随应用安装而存在,随应用更新而改变。
    • 结论: 既然叫“静态”,就意味着它们在应用运行时(Runtime)是无法被用户修改、添加或删除的
  • 动态配置(Dynamic Configuration):
    • 需求: 图片中提到的“让用户在应用内动态配置”、“自定义数目和顺序”,这属于**动态快捷方式(Dynamic Shortcuts)固定快捷方式(Pinned Shortcuts)**的范畴。

平台实现机制(以 Android 和 iOS 为例)

  • Android:
    • 静态: 写在 XML 里,代码里只能获取,不能修改其内容或顺序。
    • 动态: 使用 ShortcutManager API,应用可以在运行时通过代码添加、更新、移除快捷方式,也可以改变它们的顺序。
  • iOS:
    • 静态: 写在 Info.plist 里的 UIApplicationShortcuts,不可变。
    • 动态: 使用 NSUserActivityUIApplicationShortcutItem,可以在代码中动态创建。

解决方案建议

如果用户想要实现图片中描述的“像 iOS 那样让用户自定义数目和顺序”,正确的做法不是修改静态快捷方式,而是:

  1. 改用动态快捷方式(Dynamic Shortcuts): 在应用内部设置界面,允许用户选择功能,然后调用系统 API 将这些功能注册为动态快捷方式。
  2. 混合使用: 保留几个最常用的作为“静态”入口(保底),其余的由用户自定义生成“动态”入口。
  3. 注意限制: 无论是 Android 还是 iOS,系统通常对快捷方式的总数量有限制(例如 Android 通常建议不超过 5 个,iOS 也是类似),超过数量的旧快捷方式可能会被系统自动清除。

总结

图片中的问题是一个典型的“用错概念”的问题。静态快捷方式天然是不可配置的。要实现动态配置,必须转向使用动态快捷方式 API

在鸿蒙上建议使用服务卡片

可以参考一下这个官方demo:https://gitcode.com/HarmonyOS_Samples/CardInfoRefresh

cke_2015.png

前段时间刚调研过这个能力。首先,在 HarmonyOS 中,不能像 iOS 那样完全由用户在应用内动态、无限制地配置快捷方式(Shortcuts)的数目和顺序。

主要受限于系统框架的设计:

  1. IOS 的实现方式是在 代码中动态生成 (UIApplicationDelegate),HarmonyOS主要在 module.json5 静态配置;
  2. IOS 每次长按图标时实时请求最新列表,HarmonyOS 主要通过 addShortcut 添加固定入口。

如果你想让用户实现“类 iOS”的体验,可以采用以下折中方案

方案一:

  1. 应用内设置页:提供一个“常用功能”设置页,让用户勾选 Top 4 的功能。
  2. 持久化存储:将用户的选择存入 Preferences。
  3. 启动页路由分发:

由于长按菜单是静态的,你可以将静态菜单的入口统一指向一个 DispatcherAbility。

DispatcherAbility 启动后,读取 Preferences 中用户配置的最新功能,直接跳转到对应页面。

  1. 利用 Widget(服务卡片):HarmonyOS 的服务卡片比快捷方式更强大。

你可以开发一个“多功能卡片”,允许用户在卡片上点击不同的按钮,或者通过卡片的“切换样式”功能来展示不同的功能入口。

方案二(没有试过):通过 shortcutManager.addShortcut 让用户把喜欢的功能单独生成桌面图标。

不支持

在HarmonyOS Next中,静态快捷方式通过shortcuts.json等配置文件声明,安装后固定,不支持运行时动态修改配置。若需动态配置,应使用shortcutManager相关API创建动态快捷方式。

静态快捷方式不支持动态配置。它在应用的 module.json5 文件中预先声明,安装后固定,无法在运行时由用户自定义数目、图标或顺序,也不允许运行时修改。

如需实现用户可自定义的快捷方式,应使用动态快捷方式。动态快捷方式通过 API(如 ShortcutManager)在应用内创建、更新、删除,完全支持自定义数量与排列,类似于 iOS 的 UIApplicationShortcutIcon 动态管理能力。

回到顶部