Android ShortCutManager 将静态快捷方式替换为动态快捷方式

问题描述

我在我的shortcuts.xml(static1、static2、static3、static4)中定义了4个静态快捷方式——全部启用。一旦我添加了动态快捷方式 (dynamic1),最后一个静态快捷方式 (static4) 就会被动态快捷方式覆盖。 因此,启动器现在显示 static1,static2,static3,static4 而不是 static1,static4。当我添加第二个动态快捷方式 (dynamic2) 时,它也会覆盖 static3。

在 ShortcutManager 文档中清楚地写到静态快捷方式总是比动态快捷方式排名更高(等级 == 0),因此,应该在动态快捷方式之前显示

https://developer.android.com/guide/topics/ui/shortcuts/managing-shortcuts#display-order

当启动器显示应用的快捷方式时,它们应按以下顺序显示

  1. 静态快捷方式:isDeclaredInManifest() 方法返回 true 的快捷方式。
  2. 动态快捷方式: ShortcutInfo.isDynamic() 方法返回 true 的快捷方式。 在每种快捷方式类型(静态和动态)中,快捷方式根据 ShortcutInfo.getRank() 按升序排序。

我不确定这里出了什么问题以及如何修复它以始终显示静态快捷方式。我的动态快捷方式的目的是提供直接共享功能

这是我添加动态快捷方式的方法

    final ArrayList<ShortcutInfoCompat> shortcuts = new ArrayList<>();
    final Set<String> categories = Collections.singleton("my.package.category.soME_CATEGORY");

    final ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(context,"shortcutId")
            .setShortLabel("some_label")
            .setIcon(IconCompat.createWithResource(context,R.drawable.some_icon))
            .setIntent(new Intent(Intent.ACTION_DEFAULT))
            .setCategories(categories)
            .setPerson(
                    new Person.Builder()
                            .setName("some_name")
                            .build()
            )
            .build();

    shortcuts.add(shortcut);

    ShortcutManagerCompat.addDynamicShortcuts(context,shortcuts);

解决方法

虽然静态快捷方式总是在动态快捷方式之前是真的,但从阅读文档来看,似乎无法保证每个组上显示的快捷方式数量。

您应该从文档中考虑几个因素:

Shortcut limitations

虽然您一次最多可以为您的应用发布五个快捷方式(静态和动态快捷方式相结合),但大多数启动器只能显示四个。

那么当你在四个静态快捷方式之外添加第五个动态快捷方式时,android应该怎么做?如果显示所有静态的,您将永远无法向用户显示动态的。

Shortcut count limitation

每个应用的启动器图标最多可以包含 getMaxShortcutCountPerActivity() 个组合的静态和动态快捷方式。不过,应用可以创建的固定快捷方式的数量没有限制。

所以要注意这个最大值,因为无论如何你都无法添加更多。

Best practices

只发布四个不同的快捷方式
尽管该 API 目前支持在任何给定时间为您的应用组合最多五个静态和动态快捷方式,但我们建议您仅发布四个不同的快捷方式以改善其在启动器中的视觉外观。


我无法告诉您应该做什么,但是根本不可能拥有那么多静态和动态快捷方式。虽然可以拥有那么多快捷方式,但这取决于启动器选择要显示的内容。因此,您应该考虑建议的最大值 4。您可以重新考虑您认为哪些快捷方式必不可少,哪些不是。

另一种方法可能是使用 Pinned Shortcuts 作为替代。