【Android必备】应用快捷方式(22)

概要


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

每个快捷方式引用一个或多个 意图,当用户选择快捷方式时,每个意向都将在您的应用程序中启动特定的操作。您可以用快捷键表示的操作示例包括:

  • 将用户导航到地图应用中的特定位置。
  • 在通信应用程序中将消息发送给朋友。
  • 在媒体应用程序中播放电视节目的下一集。
  • 加载游戏应用程序中的最后一个保存点。

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

  • 静态快捷方式在打包到APK中的资源文件中定义。因此,您必须等到更新整个应用程序才能更改这些静态快捷方式的详细信息。
  • 动态快捷方式在运行时使用 ShortcutManagerAPI发布。在运行时期间,您的应用可以发布,更新和删除其动态快捷方式。
  • 固定快捷方式在运行时发布,也使用 ShortcutManagerAPI。在运行时期间,您的应用可以尝试固定快捷方式,此时用户会收到一个确认对话框,要求他们允许固定快捷方式。固定的快捷方式仅在用户接受固定请求时出现在受支持的启动器中。

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

您可以一次为您的应用发布最多五个快捷方式(静态快捷方式和动态快捷方式组合)。但是,某些启动器应用程序不会显示您为应用程序创建的每个静态和动态快捷方式。

用户可以创建的固定快捷方式的数量没有限制。即使您的应用无法删除已固定的快捷方式,但仍可以禁用它们。

【Android必备】应用快捷方式(22)

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

使用静态快捷键


静态快捷方式应提供应用程序中通用操作的链接,这些操作应在应用程序当前版本的整个生命周期内保持一致。静态快捷方式的好候选者包括查看发送的消息,设置闹钟以及显示用户当天的锻炼活动。

要创建静态快捷方式,请完成以下一系列步骤:

    • 在应用的清单文件(AndroidManifest.xml)中,找到一个活动,其意图过滤器设置为 android.intent.action.MAIN 动作和 android.intent.category.LAUNCHER 类别。
    • <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>
    • 创建一个新的资源文件:res/xml/shortcuts.xml。
<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>

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

注意:如果您将多个意图与快捷方式相关联,系统将在资源文件中启动与该快捷方式的最后一个意图相对应的活动,并在后方堆栈中执行其他活动 。在这种情况下,当用户选择快捷方式然后按下后退键时,您的应用程序将启动与资源文件中列出的快捷方式的倒数第二个意向对应的活动。这种行为模式会一直重复按下后退按钮,直到用户清除快捷方式创建的后台堆栈。当用户下一次按下后退按钮时,系统将其导航回启动器。

使用动态快捷键


动态快捷方式应提供指向您的应用中特定的,上下文相关的操作的链接。这些操作可能会在应用程序的使用之间发生变化,即使在您的应用程序运行时它们也可能会发生更改 动态快捷方式的好候选者包括调用特定人员,导航到特定位置以及查看特定游戏的当前分数。

该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)及更高版本上,您可以创建固定快捷方式。与静态和动态快捷方式不同,固定快捷方式作为单独的图标显示在受支持的启动器中。图2显示了这两种快捷方式之间的区别。
【Android必备】应用快捷方式(22)
注意:当您尝试将快捷方式固定到受支持的启动器上时,用户会收到一个确认对话框,要求其允许固定快捷方式。如果用户不允许快捷方式被固定,则启动程序将取消该请求。

要使用您的应用将快捷方式固定到受支持的启动器,请完成以下一系列步骤:

  1. 使用 isRequestPinShortcutSupported()来验证设备的默认启动支持,程序快捷方式的牵制。
  2. ShortcutInfo根据快捷方式是否已存在,以两种方式之一创建对象:

    • 如果快捷方式已存在,请创建一个 ShortcutInfo仅包含现有快捷方式标识的对象。系统会自动查找并锁定与快捷方式相关的所有其他信息。
    • 如果要固定新的快捷方式,请创建一个ShortcutInfo包含新快捷方式 的ID,意向和短标签的对象。
  3. 尝试通过调用将快捷方式固定到设备启动器 requestPinShortcut()。在此过程中,您可以传入一个 PendingIntent对象,该对象仅在快捷方式成功锁定时才会通知您的应用程序。

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

固定快捷方式后,您的应用可以使用该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)及更低版本的API。支持库退回到已弃用的 EXTRA_SHORTCUT_INTENT额外内容以尝试锁定过程。

您还可以创建一个专门的活动,帮助用户创建快捷方式,完成自定义选项和确认按钮。图3显示了Gmail应用程序中此类活动的一个示例。
【Android必备】应用快捷方式(22)
在您应用的清单文件中,添加 ACTION_CREATE_SHORTCUT 到活动的元素。该声明在用户尝试创建快捷方式时设置以下行为: <intent-filter>

  1. 系统启动您的应用程序的专业活动。
  2. 用户设置快捷方式的选项。
  3. 用户选择确认按钮。

  4. 此时,您的应用使用该createShortcutResultIntent()方法创建快捷 方式。此方法返回一个 Intent,您的应用程序将使用返回到以前执行的活动setResult()。

  5. 您的应用程序调用finish()用于创建自定义快捷方式的活动。

跟踪捷径使用情况


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

  • 用户选择具有给定ID的快捷方式。
  • 用户打开该应用程序并手动完成对应于相同快捷方式的操作。

禁用快捷键


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

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

测试捷径


要测试您的应用的快捷方式,请在包含支持快捷方式的启动器的设备上安装您的应用。您应该可以执行以下操作:

  • 长时间点击应用的启动器图标即可查看您为应用定义的快捷方式。
  • 点击并拖动快捷方式将其固定到设备的启动器。

您可以使用这些交互来测试添加,更新,禁用和删除快捷方式的效果。

分配多个意图


使用时创建快捷方式 ShortcutInfo.Builder,您可以使用, setIntents() 而不是 setIntent()。通过调用setIntents(),您可以在用户选择快捷方式时在应用程序内启动多个活动,将除列表中最后一项活动以外的所有活动都放置在 后退堆栈中。如果用户决定按设备的后退按钮,他们会在您的应用中看到另一个活动,而不是返回到设备的启动器。

费率限制


当使用 setDynamicShortcuts(), addDynamicShortcuts()或 updateShortcuts() 方法,记住,你可能只能调用这些方法的时间在一个特定的号码后台程序,与当前在前台没有任何活动或服务的应用程序。在生产环境中,您可以通过将您的应用程序置于前台来重置此限速。

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

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

备份还原


如果允许用户通过在应用的清单文件中包含属性分配来更改设备时备份和恢复应用 ,请记住以下关于应用快捷方式的要点: android:allowBackup="true"

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

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

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

最佳实践


在设计和创建应用程序的快捷方式时,应遵循以下准则:
遵循快捷方式设计指南

要使您的应用的快捷方式与用于系统应用的快捷方式在视觉上保持一致,请按照应用快捷方式设计指南进行操作。

只发布四种截然不同的捷径

虽然API目前在任何时候都支持最多五个静态快捷方式和动态快捷方式的组合,但建议您随时只发布四个不同的快捷方式,以改善快捷方式在启动器中的视觉外观。

限制快捷键描述长​​度

在启动器中显示应用快捷方式的菜单中,空间有限。如果可能,请将快捷方式的“简短描述”的长度限制为10个字符,并将“长描述”的长度限制为25个字符。

维护快捷方式和操作使用记录

对于您创建的每个快捷方式,请考虑用户可以在应用中直接完成相同任务的不同方式。请记住reportShortcutUsed() 在每种情况下都要打电话 ,以便启动程序可以保持代表您快捷键的操作的准确历史记录。

仅在保留其含义时更新快捷方式

更改动态和固定快捷方式时,updateShortcuts() 仅在更改保留其含义的快捷方式的信息时调用 。否则,您应该使用以下方法之一,具体取决于您正在重新创建的快捷方式的类型:

  • 动态快捷键: addDynamicShortcuts()或 setDynamicShortcuts()。
  • 固定快捷键: requestPinShortcut()。

例如,如果您创建了用于导航到超市的快捷方式,那么如果超市的名称发生更改但其位置保持不变,则更新快捷方式将是适当的。但是,如果用户在不同的超市位置开始购物,则最好创建一个新的快捷方式。

动态快捷方式在备份和恢复期间不会保留

当设备进行备份和恢复操作时,不会保留动态快捷方式。因此,建议您检查getDynamicShortcuts() 每次启动应用程序时返回的对象数量, 并根据需要重新发布动态快捷方式,如“ 备份和还原”部分中的代码段所示 。

其他代码示例


Android的AppShortcuts 样品还演示了如何使用覆盖此页面上的API。

Lastest Update:2018.04.27

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Android必备】应用快捷方式(22)

猜你喜欢

转载自blog.51cto.com/4789781/2122483