如果你的应用程序的目标是Android 7.1(API级别25)或更高,你可以定义应用程序中特定动作的快捷方式,这些快捷方式可以显示在一个支持的启动器中。快捷方式让你的用户在你的应用程序中快速启动常见或推荐的任务。
每个快捷方式都引用了一个或多个意图,每一个都在用户选择快捷方式时,在你的应用程序中启动一个特定的动作。
你可以以快捷方式表达的行动的例子包括以下:
在地图应用程序中导航用户到特定的位置。
在通信应用中向朋友发送消息。
在一个媒体应用中播放下一集电视节目。
在游戏应用中加载最后一个保存点。
你可以为你的应用发布以下的快捷方式:
静态快捷方式是在一个资源文件中定义的,它被打包到一个APK中。
因此,您必须等到更新您的整个应用程序来更改这些静态快捷方式的细节。
动态快捷方式是在运行时使用快捷管理器API发布的。
在运行时,你的应用程序可以发布、更新和删除它的动态快捷方式。
固定的快捷方式在运行时发布,并使用快捷管理API。
在运行时,你的应用程序可以尝试输入快捷方式,在此期间用户会收到一个确认对话框,请求他们的权限来确定快捷方式。
只有在用户接受固定请求时,才会出现被钉住的快捷方式。
注意:用户还可以通过将应用的静态和动态快捷方式复制到启动器上,从而创建固定的快捷方式。
Nexus 6P上的应用程序快捷方式
图1所示。
使用应用程序快捷方式,你可以在你的应用程序中快速地深入到你的应用程序中。
你可以在你的应用程序中发布最多5个快捷键(静态快捷键和动态快捷键),然而,一些启动应用程序并没有显示你为应用所创建的所有静态和动态快捷方式。
用户可以创建的固定快捷键的数量是没有限制的。
即使你的应用程序不能移除固定的快捷键,它仍然可以禁用它们。
注意:尽管其他应用程序不能在你的快捷方式中访问元数据,但启动器本身可以访问这些数据。
因此,这些元数据应该隐藏敏感的用户信息。
使用静态快捷键
静态快捷方式应该在应用程序中提供链接,这些操作应该在应用程序当前版本的生命周期内保持一致。
静态快捷方式的优秀候选者包括查看发送的消息、设置警报和显示用户当天的锻炼活动。
要创建一个静态快捷方式,请完成以下步骤:
1.在你的应用程序清单文件(AndroidManifest.xml),找到一个活动的意图过滤器设置为android.intent.action.MAIN行动和android.intent.category.LAUNCHER类别。
2.将元素添加到这个活动中,该活动引用了应用程序的快捷方式定义的资源文件:
<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 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>有关如何在资源文件中配置快捷方式的更多细节,请参阅快捷管理器API引用。
注意:如果将多个意图与一个快捷方式联系起来,系统将启动与该资源文件中快捷方式的最后一个意图相对应的活动,并在后面的堆栈中进行其他活动。
在这种情况下,当用户选择一个快捷方式,然后按下返回键,你的应用程序就会启动与资源文件中列出的快捷方式的倒数第二个目标对应的活动。
此行为模式将继续重复按后退按钮,直到用户清除创建快捷方式的后栈。
当用户下一次按下后退按钮时,系统会将他们导航回启动器。
使用动态捷径
动态快捷键可以在你的应用程序中提供特定的、上下文敏感的动作链接,这些动作可以在你的应用程序的使用之间发生变化,即使你的应用在运行,它们也可以改变。
对于动态快捷键的优秀候选包括调用一个特定的人、导航到特定的位置,以及查看特定游戏的当前得分。
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显示了这两种快捷方式的区别。
注意:当你试图在一个受支持的启动器上钉一个快捷方式时,用户会收到一个确认对话框,询问他们的权限来确定快捷方式。
如果用户不允许被固定的快捷方式,启动程序将取消该请求。
要使用你的应用程序,在一个支持的启动器上钉住一个快捷方式,完成以下步骤:
1.使用isRequestPinShortcutSupported()来验证设备的默认启动支持应用内固定的捷径。
2.以两种方式创建一个ShortcutInfo
对象,这取决于快捷方式是否已经存在:
a.如果这个快捷方式已经存在,那么就创建一个 ShortcutInfo
.对象,它只包含现有的快捷方式的ID。系统会自动找到并将所有与该快捷方式相关的信息都自动地找到。
b.如果你正在固定一个新的快捷方式,创建一个包含ID、意图和新快捷方式的短标签的ShorcutInfo对象。
3.尝试通过调用requestpin捷径()将快捷方式钉在设备的启动器上。
在这个过程中,你可以传递一个pending意向对象,只有当快捷键被成功地通知时,它才会通知你的应用程序。
注意:如果用户不允许将快捷键固定在启动器上,你的应用程序就不会接收回调。
在快捷方式被固定之后,应用程序可以使用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)和低。
支持库返回到已弃用的额外目标,以尝试固定进程。
您还可以创建一个专门的活动,帮助用户创建快捷方式,完成定制选项和确认按钮。
图3显示了Gmail应用程序中此类活动的一个例子。
在你的应用程序的清单文件中,添加actioncreate快捷方式到活动的元素。
当用户试图创建一个快捷方式时,该声明设置如下行为:
1.这个系统启动了你的应用程序的专门活动。
2.用户为快捷方式设置选项。
3.用户选择确认按钮。
4.在这一点上,您的应用程序创建快捷方式使用createShortcutResultIntent()方法。
该方法返回一个意图,您的应用程序将使用setResult()将其传递回之前执行的活动。
您的应用程序调用finish()用于创建自定义快捷方式的活动。
跟踪快捷键的使用
为了确定出现静态和动态快捷键的情况,启动程序检查了快捷键的激活历史。
您可以通过调用reportShortcutUsed()
方法来跟踪用户在应用程序内完成特定操作的情况,并通过快捷方式的ID,当以下事件发生时:
用户使用给定的ID选择快捷方式。
用户打开应用程序,并手动完成与相同快捷方式对应的操作。
禁用快捷键
因为你的应用和它的用户可以在设备的启动器上钉上快捷键,所以这些固定的快捷方式可能会让用户在你的应用中直接使用那些过时的或者不再存在的操作。
为了管理这种情况,您可以禁用您不希望用户通过调用disableShortcuts()来选择的快捷方式,该方法从静态和动态快捷方式列表中删除指定的快捷方式,并禁用这些快捷方式的任何固定副本。
您还可以使用该方法的重载版本来定义当用户尝试启动禁用的快捷方式时应该出现的错误消息。
注意:如果你在更新应用程序时删除了一些应用的静态快捷方式,系统会自动禁用这些快捷方式。
测试快捷键
为了测试你的应用程序的快捷方式,你可以在一个设备上安装一个支持快捷键的启动器。
然后,您应该能够执行以下操作:
在你的应用的启动器图标上长时间点击查看你为应用定义的快捷方式。
点击并拖动一个快捷方式将其钉到设备的启动器上。
您可以使用这些交互来测试添加、更新、禁用和删除快捷方式的效果。
分配多个意图
当使用快捷键创建快捷方式时。
构建器,您可以使用, setDynamicShortcuts()
, addDynamicShortcuts()
, or updateShortcuts()
,在用户选择快捷方式时,可以在应用程序中启动多个活动,将所有的活动都放在后堆栈的列表中。
如果用户决定按下设备的后退按钮,他们将看到你的应用程序中的另一个活动,而不是返回到设备的启动器。
备份和恢复
如果你允许用户在改变设备时备份和恢复你的应用,包括 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. } } } // ... }
最佳实践
在设计和创建应用程序的快捷方式时,你应该遵循以下原则:
遵循快捷方式设计原则
为了让你的应用程序的快捷方式与系统应用的快捷方式保持一致,遵循应用快捷方式的设计指南。
只发布4种不同的快捷方式
尽管API目前支持最多5个静态快捷方式和应用程序的动态快捷方式,但建议你在任何时候只发布4个不同的快捷方式,以改善启动器中的快捷方式。
将快捷方式描述长度限制
在菜单中,空间是有限的,显示了你的应用程序在启动器中的快捷方式。
在可能的情况下,将“简短描述”的长度限制为10个字符,并将“长描述”的长度限制为25个字符。
维护快捷和操作使用历史
对于你创建的每一个快捷方式,考虑用户可以在你的应用程序中直接完成相同任务的不同方式,记得在这些情况下调用reportShortcutUsed()
,这样启动器就能保持你快捷方式的准确历史记录。
只有当它们的含义被保留时,才会更新快捷方式
当更改动态和固定的快捷键时,只在更改保持其含义的快捷方式的信息时调用updateShortcuts()
。
否则,您应该使用以下方法之一,这取决于您重新创建的快捷方式的类型:
动态快捷键:addDynamicShortcuts()
or setDynamicShortcuts()
.
快捷键: requestPinShortcut()
.
例如,如果你创建了一个进入超市的快捷方式,那么如果超市的名字改变了,但是它的位置不变,那么更新快捷方式是很合适的。
如果用户开始在不同的超市购物,最好是创建一个新的快捷方式。
在备份和恢复期间,动态快捷键不会被保留
当设备进行备份和恢复操作时,动态的快捷方式不会被保留。
因此,建议在每次启动应用程序时检查getDynamicShortcuts()
返回的对象数量,并根据需要重新发布动态快捷方式,如备份和恢复部分中的代码片段所示。
文中有错误的地方还请多多指正!