Skip to content

Latest commit

 

History

History
181 lines (111 loc) · 13.1 KB

管理快捷方式.md

File metadata and controls

181 lines (111 loc) · 13.1 KB

管理快捷方式

原文(英文)地址

创建快捷方式后,您可能需要在应用的生命周期内管理它们。例如,您可能希望通过确定用户使用快捷方式完成特定操作的频率来优化您的应用。在另一种情况下,您可能决定禁用固定快捷方式,以防止您的应用执行过时或丢失的操作。本文档介绍了这些管理快捷方式的方法,还有几种其他常用的管理快捷方式的方法。

快捷方式行为(behavior)

以下部分包含有关快捷方式行为的常见内容,包括可见性(visibility),显示顺序(display order)和排名(ranks)。

快捷方式可见性

重要安全说明:所有快捷方式信息都存储在凭据加密存储( credential encrypted storage)中,因此您的应用在解锁设备之前无法访问用户的快捷方式。

当用户执行特定手势时,静态快捷方式和动态快捷方式将显示在受支持的启动器中。在当前支持的启动器上,手势是长按应用程序的启动器图标,但实际手势可能与其他启动器应用程序不同。

LauncherApps类为启动器应用程序提供API以访问快捷方式。

由于固定的快捷方式出现在启动器本身中,因此它们始终可见。仅在以下情况下,才会从启动器中删除固定的快捷方式:

  • 用户将其删除。
  • 与快捷方式关联的应用程序已卸载。
  • 用户通过通过 设置>应用和通知,然后选择应用,然后按存储>清除存储来清除应用的数据。

快捷方式的显示顺序

当一个启动器展示app的快捷方式时,他们应该按照以下顺序进行展示:

1:静态快捷方式:isDeclaredInManifest()方法返回True的快捷方式

2:动态快捷方式:ShortcutInfo.isDynamic()方法返回true的快捷方式

对于每一种类型的快捷方式(静态和动态),快捷方式按照ShortcutInfo.getRank()获得的Ranks(排名)信息来进行排序。

对于每一个快捷方式,Ranks是一个非负的、顺序(sqquential)的整数,你可以通过调用updateShortcuts(List)addDynamicShortcuts(List),或者setDynamicShortcuts(List)方法去更新快捷方式的排名。

注意:每一种类型的快捷方式(静态和动态),Ranks是会自动自动调整的。比如,有三个动态快捷方式,其ranks值分别是0,1,2,添加另一个ranks值为1的动态快捷方式之后就需要当前第二个位置的动态快捷方式就应该被代替。结构,第三和第四个快捷方式移动到快捷方式列表的底部,其排名分别变为2和3。

管理多个intent和activity

如果你想要当用户点击你应用的快捷方式时执行多个动作,你可以配置连续触发多个activity,你可以通过分配多个intent,从一个activity启动另一个activity,或者通过设置intent flag来完成此操作,具体取决于快捷方式的类型。

分配多个intent

当你使用ShortcutInfo.Builder创建快捷方式时,你可以使用setIntents()而不是setIntent()。通过调用setIntents(),当用户选择快捷方式时,您可以在应用程序中启动多个Activity,将列表中的除了最后一个Activity之外的所有activity放在回退栈(back stack)中。

如果用户想要点击设备的后腿按钮,他会看到另一个activity而不是直接返回设备的启动器界面。

注意:当用户点击了一个快捷方式然后点击后退按钮之后,你的app会启动从资源文件中列出的列表的倒数第二个Intent对应的activity。重复按下后退按钮后,系统将会继续按照此逻辑启动后面的activity(如果有的话,直到用户清除快捷方式创建的回退栈。当用户下一次按下后退按钮时,系统将会导航回启动器。

从另一个activity启动本activity

静态快捷方式不能有自定义的Intent flag。第一个静态类型快捷方式的Intent flag始终是

Intent.FLAG_ACTIVITY_NEW)和Intent.TASK FLAG_ACTIVITY_CLEAR_TASK.这意味着,当应用程序已在运行时,启动静态快捷方式时,应用程序中的所有现有Activity都将被销毁。如果不希望出现这种情况,可以使用trampoline(蹦床?) Activity,或者Activity.onCreate(Bundle)中启动另一个不可见的Activity,然后调用Activity.finish():

  • 在AndroidManifest.xml文件中,trampoline Activity应该包含属性赋值android:taskAffinity =“”。
  • 在快捷方式的资源文件中,静态快捷方式中的Intent应引用trampoline Activity。

有关trampoline Activity的更多信息,请阅读Activity的生命周期)中从另一个Activity启动一个Activity部分。

设置Intent flag

动态快捷方式可以设置任意Intent flag。您最好指定Intent.FLAG_ACTIVITY_CLEAR_TASK以及其他flag。否则,如果您在应用程序运行时尝试启动其他Task,则可能不会显示目标Activity。

要了解有关Task和Intent flag的更多信息,请阅读理解Task和回退栈

更新快捷方式

每一个应用程序启动器图标都可以最多包含getMaxShortcutCountPerActivity()个(静态的和/或动态的)快捷方式。但是,应用程序可以创建的固定快捷方式的数量没有限制。

对于固定动态快捷方式,即使发布者将其作为动态快捷方式删除,固定的快捷方式仍然可见并且可以启动。这允许应用程序具有多于getMaxShortcutCountPerActivity()个数量的快捷方式。

举个例子,比如getMaxShortcutCountPerActivity()返回了4:

  • 一个社交类app创建了4个动态快捷方式,表示4个最常用的会话(c1,c2,c3,c4)

  • 用户固定了这4个快捷方式

  • 之后,用户又开启了3个新的会话(c5,c6和c7),所以发布商应用程序重新发布其动态快捷方式。新的动态快捷键列表是:c4,c5,c6,c7。

    该应用程序必须删除c1,c2和c3,因为它无法显示四个以上的动态快捷方式。但是,c1,c2和c3仍然是用户可以访问和启动的固定快捷方式。

    用户现在可以访问总共七个链接到发布者应用中的Activity的快捷方式。这是因为总数包括最大快捷方式数和三个固定的快捷方式。

  • 该应用程序可以使用updateShortcuts(List)更新任何现有的七个快捷方式。例如,您可以在聊天对象的的头像发生更改时更新这组快捷方式。

  • addDynamicShortcuts(List)和setDynamicShortcuts(List)方法也可用于更新具有相同ID的现有快捷方式。但是,它们不能用于更新非动态快捷方式和固定快捷方式,因为这两种方法会尝试将给定的快捷方式列表转换为动态快捷方式。

要详细了解应用程序快捷方式指南(包括更新快捷方式),请参阅 Best practices.

处理系统局部设置更改

app应该在收到Intent.ACTION_LOCALE_CHANGD广播时更新动态快捷方式和固定快捷方式,因为该广播标志着系统局部设置已更改。

跟踪(Track)快捷方式用法

要确定什么情况应该出现静态快捷方式、什么情况应该出现动态快捷方式,启动器会检查快捷方式的历史激活记录。通过调用reportShortcutUsed()方法并在发生以下任一事件时向其传递快捷方式的ID,您可以跟踪用户何时在应用程序中完成特定操作:

  • 用户选择具有给定ID的快捷方式。
  • 在应用程序内,用户手动完成与同一快捷方式对应的操作。

禁用快捷方式

由于您的应用及应用的用户可以将快捷方式固定到设备的启动器,因此这些固定的快捷方式可能会引导用户执行应用中已过期或不再存在的操作。要管理这种情况,您可以通过调用disableShortcuts()来禁用您不希望用户选择的快捷方式,该操作会从静态和动态快捷方式列表中删除指定的快捷方式,并禁用这些快捷方式的任何被固定的副本。您还可以使用此方法的重载版本,该方法接受CharSequence作为自定义错误消息。当用户尝试启动任何禁用的快捷方式时,将显示该错误消息。

注意:如果在更新应用程序时删除了您应用程序的某些静态快捷方式,系统会自动禁用这些快捷方式。

限速(rate limiting)

使用setDynamicShortcuts(),addDynamicShortcuts()或updateShortcuts()方法时,请记住,您可能只能在一个没有任何前台Service或者前台Activity的后台APP中调用这些方法特定次。调用这些方法被调用次数的限制称为速率限制(rate limiting)。此功能用于防止ShortcutManager过度消耗设备资源。

当速率限制处于生效状态时,isRateLimitingActive()将返回true。但是,在某些事件期间会重置速率限制,因此即使是后台应用程序也可以调用ShortcutManager的方法,直到再次达到速率限制。这些事件包括以下内容:

  • 一个应用程序来到前台。
  • 系统局部设置发生更改。
  • 用户在一个通知(notification)中执行内联回复(inline reply)操作。

如果在开发或测试期间遇到速率限制,您可以从设备的设置中选择开发人员选项>重置ShortcutManager速率限制,或者您可以在adb中输入以下命令:

$ adb shell cmd shortcut reset-throttling [ --user your-user-id ]

备份和还原

通过在应用程序的清单文件中包含android:allowBackup =“true”属性,您可以允许用户在更改设备时对应用程序执行备份和还原操作。如果您允许备份和还原,请记住以下有关应用程序快捷方式的要点:

  • 静态快捷方式会自动重新发布,但只有在用户在新设备上重新安装应用程序后才能重新发布。
  • 不会备份动态快捷方式,因此您必须在应用中包含特定逻辑,以便在用户在新设备上打开您的应用时重新发布它们。
  • 固定快捷方式会自动恢复到设备的启动器,但系统不会备份与固定快捷方式关联的图标。因此,您应该在应用中保存固定快捷方式的图像,以便在新设备上轻松恢复它们。

以下代码段显示了如何更好地恢复应用的动态快捷方式,以及如何检查应用的固定快捷方式是否已保留:

  • kotlin

    class MyMainActivity : Activity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val shortcutManager = getSystemService(ShortcutManager::class.java)
    
            if (shortcutManager!!.dynamicShortcuts.size == 0) {
                // Application restored. Need to re-publish dynamic shortcuts.
                if (shortcutManager.pinnedShortcuts.size > 0) {
                    // Pinned shortcuts have been restored. Use
                    // updateShortcuts() to make sure they contain
                    // up-to-date information.
                }
    
            }
        }
        // ...
    }
  • java

    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ShortcutManager shortcutManager =
                    getSystemService(ShortcutManager.class);
    
            if (shortcutManager.getDynamicShortcuts().size() == 0) {
                // Application restored. Need to re-publish dynamic shortcuts.
                if (shortcutManager.getPinnedShortcuts().size() > 0) {
                    // Pinned shortcuts have been restored. Use
                    // updateShortcuts() to make sure they contain
                    // up-to-date information.
                }
            }
        }
        // ...
    }

其他资源

Android AppShortcuts示例项目展示了本文档讨论的技术点的一些实现。