欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

App Shortcuts

程序员文章站 2024-02-17 13:46:34
...

如果您的应用定位到Android 7.1(API级别25)或更高版本,则可以为应用中的特定操作定义快捷方式。 这些快捷方式可以显示在支持的启动器中。 快捷方式可让您的用户快速启动应用程序中的常见或推荐任务。

每个快捷方式引用一个或多个意图(intents),当用户选择快捷方式时,每个意图都会在您的应用程序中启动特定操作。你可以通过快捷方式做下面一些事:

将用户导航到地图应用中的特定位置。

在通讯录中传送讯息给朋友。

在媒体应用中播放电视节目的下一集。

在游戏应用程序中加载最后一个保存点。

您可以为您的应用发布以下类型的快捷方式:

静态快捷方式(Static shortcuts)定义在一个打包成APK的资源文件中。 因此,您必须等到更新整个应用程序才能更改这些静态快捷方式的详细信息。
使用 ShortcutManager API在运行时发布动态快捷方式(Dynamic shortcuts)。 在运行时,您的应用程序可以发布,更新和删除其动态快捷方式。
固定快捷方式(Pinned shortcuts)在运行时发布,并使用 ShortcutManager API。 在运行时,您的应用程序可以尝试固定快捷方式,此时用户收到一个确认对话框,要求他们准许快捷方式。 仅当用户接受固定请求时,固定的快捷方式才会显示在支持的启动器中。

注意:用户还可以通过将应用程序的静态和动态快捷方式复制到启动器上来创建固定快捷方式。

您的应用程序最多可以发布最多五个快捷方式(静态快捷方式和动态快捷方式)。 但是,某些启动器应用程序不会显示您为应用程序创建的每个静态和动态快捷方式。(PS:只能在 Google 的 Nexus 及 Pixel 设备上使用)

用户可以创建的应用程序的固定快捷方式数量没有限制。 即使你的应用程序不能删除固定的快捷方式,它仍然可以禁用它们。

注意:虽然其他应用程序无法访问快捷方式中的元数据,但启动器本身可以访问此数据。 因此,这些元数据应隐藏敏感的用户信息。

静态快捷方式

静态快捷方式应提供应用程序中通用操作的链接,这些操作在应用程序的当前版本的有效期内应保持一致。 可以考虑创建静态快捷方式包括查看发送的消息,设置闹钟以及显示用户当天的运动活动。

创建静态快捷方式的步骤:

1、在应用程序的清单文件(AndroidManifest.xml)中,找到一个activity,其意图过滤器action设置为 android.intent.action.MAIN同时category设置为android.intent.category.LAUNCHER

2、在此活动中添加一个<meta-data> 元素,引用应用程序的快捷方式定义的资源文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapplication">
  <application ... >
    <activity android:name="Main">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="android.app.shortcuts"
                 android:resource="@xml/shortcuts" />
    </activity>
  </application>
</manifest>

 

 

 

3、创建一个资源文件:res/xml/shortcuts.xml。

在这个新资源文件中,添加一个<shortcuts>根元素,其中包含一个<快捷方式>元素列表。 反过来,每个<快捷方式>元素包含有关静态快捷方式的信息,包括其图标,其描述标签及其在应用程序中启动的意图:

 

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <shortcut
    android:shortcutId="compose"
    android:enabled="true"
    android:icon="@drawable/compose_icon"
    android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    android:shortcutLongLabel="@string/compose_shortcut_long_label1"
    android:shortcutDisabledMessage="@string/compose_disabled_message1">
    <intent
      android:action="android.intent.action.VIEW"
      android:targetPackage="com.example.myapplication"
      android:targetClass="com.example.myapplication.ComposeActivity" />
    <!-- If your shortcut is associated with multiple intents, include them
         here. The last intent in the list determines what the user sees when
         they launch this shortcut. -->
    <categories android:name="android.shortcut.conversation" />
  </shortcut>
  <!-- Specify more shortcuts here. -->
</shortcuts>


有关如何在资源文件中配置快捷方式的更多详细信息,请参阅ShortcutManager API参考。

 

 

 

注意:如果将多个意图与快捷方式相关联,则系统将启动与资源文件中快捷方式最后意图相对应的活动,其他活动放在返回栈(back stack)中。 在这种情况下,当用户选择快捷方式后,按下后退键,您的应用程序将启动与资源文件中列出的快捷方式的倒数第二个意图相对应的活动。 这种行为模式在重复按下后退按钮时重复进行,直到用户把快捷方式创建的堆栈中的所有活动都过了一遍。 当用户接下来按下后退按钮时,系统将其导航回发射器。

动态快捷方式

动态快捷方式应提供去到应用程序中特定action的链接。 这些操作可能会在应用程序的使用之间发生变化,即使在您的应用程序运行时它们也可以更改。 可以考虑创建动态快捷方式包括打电话给特定的人,浏览特定的位置,以及查看特定游戏的当前分数。

ShortcutManager API允许您在动态快捷方式上完成以下操作:

发布:使用setDynamicShortcuts()重新定义动态快捷方式的整个列表,或者使用 addDynamicShortcuts() 来扩充动态快捷方式的现有列表。

更新:使用 updateShortcuts()方法。

删除:使用 removeDynamicShortcuts()删除一组动态快捷方式,或使用removeAllDynamicShortcuts()删除所有动态快捷方式。

下面是一个创建动态快捷方式并将其与应用程序关联的示例:

 

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1")
    .setShortLabel("Web site")
    .setLongLabel("Open the web site")
    .setIcon(Icon.createWithResource(context, R.drawable.icon_website))
    .setIntent(new Intent(Intent.ACTION_VIEW,
                   Uri.parse("https://www.mysite.example.com/")))
    .build();

shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));


固定快捷方式

 

在Android 8.0(API级别26)及更高版本上,您可以创建固定的快捷方式。 与静态和动态快捷方式不同,固定快捷方式作为单独的图标显示在支持的启动器中。 下图显示了这两种类型的快捷方式之间的区别。

App Shortcuts

注意:当您尝试将快捷方式固定到受支持的启动器时,用户会收到一个确认对话框,要求他们准许快捷方式。 如果用户不允许快捷方式被固定,则启动器将取消该请求。

要使用您的应用程序将支持的启动器的快捷方式固定,请完成以下步骤:

1、使用isRequestPinShortcutSupported()来验证设备的默认启动器是否支持应用内固定快捷方式。

2、根据快捷方式是否存在,以两种方式之一创建ShortcutInfo 对象:
a、如果快捷方式已存在,请创建一个仅包含现有快捷方式ID的ShortcutInfo 对象。 系统会自动查找和引导与快捷方式相关的所有其他信息。
b、如果您正在固定新的快捷方式,请创建一个ShortcutInfo 对象,该对象包含新快捷方式的ID,意图和短标签。

3、尝试通过调用requestPinShortcut()将快捷方式固定到设备的启动器。 在此过程中,您可以传入一个 PendingIntent对象,该对象只有当快捷方式被成功固定时才通知应用。

注意:如果用户不允许将快捷方式固定在启动器上,则应用程序不会收到callback。

固定快捷方式后,您的应用可以使用updateShortcuts()方法更新其内容。

以下代码段演示此过程:

 

ShortcutManager mShortcutManager =
        context.getSystemService(ShortcutManager.class);

if (mShortcutManager.isRequestPinShortcutSupported()) {
    // Assumes there's already a shortcut with the ID "my-shortcut".
    // The shortcut must be enabled.
    ShortcutInfo pinShortcutInfo =
            new ShortcutInfo.Builder(context, "my-shortcut").build();

    // Create the PendingIntent object only if your app needs to be notified
    // that the user allowed the shortcut to be pinned. Note that, if the
    // pinning operation fails, your app isn't notified. We assume here that the
    // app has implemented a method called createShortcutResultIntent() that
    // returns a broadcast intent.
    Intent pinnedShortcutCallbackIntent =
            mShortcutManager.createShortcutResultIntent(pinShortcutInfo);

    // Configure the intent so that your app's broadcast receiver gets
    // the callback successfully.
    PendingIntent successCallback = PendingIntent.getBroadcast(context, 0,
            pinnedShortcutCallbackIntent, 0);

    mShortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.getIntentSender());
}

 

注意:另请参阅支持库API,isRequestPinShortcutSupported()requestPinShortcut(),它们在Android 7.1(API级别25)上工作。 支持库可以追溯到不推荐使用的EXTRA_SHORTCUT_INTENT以尝试固定进程。

 

您还可以创建一个专门的活动,帮助用户创建快捷方式,完成自定义选项和确认按钮。 下图显示了Gmail应用中此类活动的示例。

App Shortcuts

在应用程序的清单文件中,将 ACTION_CREATE_SHORTCUT添加到活动的<intent-filter> 元素中。 此声明在用户尝试创建快捷方式时设置以下行为:

1、系统启动您的应用程序的专门活动。
2、用户设置快捷方式的选项。
3、用户选择确认按钮。
此时,您的应用程序使用createShortcutResultIntent() 方法创建快捷方式。 此方法返回一个Intent,您的应用程序使用setResult()中继回到以前执行的活动。
4、您的应用程序在用于创建自定义快捷方式的活动中调用finish()

跟踪快捷方式的使用

要确定出现静态和动态快捷方式的情况,启动器将检查快捷方式的**历史记录。 您可以通过调用reportShortcutUsed() 方法,传入快捷方式的ID,当发生以下任一事件时,跟踪用户在应用程序中完成特定操作的时间:
1、用户选择具有给定ID的快捷方式。
2、用户打开应用程序,并手动完成对应于相同快捷方式的操作。

禁用快捷方式

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

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

测试快捷方式

要测试应用程序的快捷方式,请在包含支持快捷方式的启动器的设备上安装应用程序。 然后,您应该可以执行以下操作:
1、点击应用的启动器图标,查看您为应用定义的快捷方式。
2、点击并拖动快捷方式将其固定到设备的启动器。
您可以使用这些交互来测试添加,更新,禁用和删除快捷方式的影响。

分配多个Intent

使用ShortcutInfo.Builder创建快捷方式时,可以使用setIntents()而不是setIntent()。 通过调用setIntents(),当用户选择快捷方式时,您可以在应用程序中启动多个活动,将最后一个活动放在返回栈(back stack)中。 如果用户然后决定按设备的返回按钮,他们将在您的应用程序中看到另一个活动,而不是返回到设备的启动器。

速率限制

当使用 setDynamicShortcuts()addDynamicShortcuts(),或updateShortcuts() 方法时,请记住,您可能只能在后台应用程序中调用这些方法特定次数,目前没有活动或服务的应用程序 前景。 在生产环境中,您可以通过将应用程序置于前台来重置此速率限制。
如果在开发或测试过程中遇到速率限制,您可以从设备的设置中选择“开发人员选项”>“重置ShortcutManager速率限制”,也可以在adb中输入以下命令:

 

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

备份还原

 

如果您允许用户通过在应用程序的清单文件中包含 android:allowBackup="true" 属性分配来更改设备,即可备份和还原应用程序,请注意以下有关应用程序快捷方式的要点:
1、静态快捷方式会自动重新发布,但只有在用户在新设备上重新安装您的应用程序之后。
2、动态快捷方式未备份,因此您必须在应用程序中包含逻辑,以便在用户在新设备上打开您的应用程序时重新发布。
3、固定快捷方式将自动恢复到设备的启动器,但系统不会备份与固定快捷方式相关联的图标。 因此,您应该将固定的快捷方式的图像保存在应用程序中,以便在新设备上进行恢复。
以下代码片段显示了如何最有效地恢复应用的动态快捷方式以及如何检查应用的固定快捷方式是否被保留:

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.
            }
        }
    }
    // ...
}


最佳做法

 

在设计和创建应用程序的快捷方式时,应遵循以下准则:
1、按照捷径设计指南
要使您的应用程序的快捷方式与系统应用程序的快捷方式视觉一致,请按照“应用快捷方式设计指南(App Shortcuts Design Guidelines)”进行操作。
2、只发布四个不同的快捷方式
尽管该API目前支持在任何给定时间为您的应用最多5个静态快捷方式和动态快捷方式的组合,但建议您随时只发布四个不同的快捷方式,以提高启动器中快捷方式的视觉外观。
3、限制快捷方式描述长度
在启动器中显示应用程序快捷方式的菜单中,空间有限。如果可能,将快捷方式的“简短描述”的长度限制为10个字符,并将“长描述”的长度限制为25个字符。
4、维护快捷方式和动作使用历史
对于您创建的每个快捷方式,请考虑用户在应用程序中直接完成相同任务的不同方式。记住在每种情况下调用 reportShortcutUsed(),以便启动器维护表示快捷方式的动作的准确历史记录。
4、只有在保留含义时才更新快捷方式
更改动态和固定快捷方式时,只有在更改保留其含义的快捷方式的信息时,才能调用updateShortcuts() ,否则,您应该使用以下方法之一,具体取决于要重新创建的快捷方式的类型:
a、动态快捷方式:addDynamicShortcuts() 或 setDynamicShortcuts()
b、固定快捷方式:requestPinShortcut()
例如,如果您创建了一个导航到超市的快捷方式,如果超市的名称已更改,但其位置保持不变,则只需更新快捷方式即可。不过,如果用户在不同的超市地点开始购物,那么最好创建一个新的快捷方式。
5、在备份和还原期间,动态快捷方式不会被保留
当设备进行备份和恢复操作时,动态快捷方式不会被保留。因此,建议您在每次启动应用程序时检查getDynamicShortcuts()返回的对象数量,并根据需要重新发布动态快捷方式,如“备份和还原”(Backup and Restore )部分中的代码片段所示。

原文

相关标签: shortcut