一、介绍
在现如今的应用中,一些开发者为了把核心的业务尽快的方便让使用者触摸到,想尽各种办法。比如前期的桌面插件,点击直接拉起核心业务。现在我们在主流的APP中,只要你长按桌面快捷键,发现弹出来的是不是单一的卸载,还包括好多应用快捷键,比如微信和支付宝:付款码、收款码、扫一扫等。
这种炫酷的技术是怎么实现?它就是我们shortcut的功能。
二、shortcut的介绍
快捷方式可帮助用户快速访问您的应用的某些部分,从而为他们呈现特定类型的内容
如何以快捷方式来呈现内容取决于您的用例,以及快捷方式的上下文是属于应用驱动型还是用户驱动型。虽然静态快捷方式的上下文不会更改,而动态快捷方式的上下文会不断变化,但这两种情况下的上下文都由您的应用驱动。如果用户选择了希望应用以哪种方式(例如使用固定快捷方式)向其呈现内容,则此时的上下文是由用户定义的。以下场景展示了各类快捷方式的一些用例:
静态快捷方式最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次只能显示四个快捷方式,因此静态快捷方式对常见 Activity 非常有用。例如,如果用户希望以特定的方式查看他们的日历或电子邮件,使用静态快捷方式可确保他们在执行日常任务时始终获得一致体验。
动态快捷方式用于应用中与上下文相关的操作。上下文相关快捷方式是专为用户在应用内执行的操作而定制的。例如,如果您构建的游戏允许用户在启动时从当前关卡开始,您需要经常更新该快捷方式。动态快捷方式允许游戏在每次用户通关后更新快捷方式。
固定快捷方式用于用户驱动的特定操作。例如,用户可能需要将特定网站固定到启动器。这很有用,因为它允许用户执行自定义操作,比如一步导航到网站,这比使用浏览器的默认实例速度更快。
1、创建静态快捷方式
静态快捷方式提供指向应用内常规操作的链接,这些操作在应用当前版本的生命周期内应保持一致。适合使用静态快捷方式的操作包括查看已发邮件、设置闹钟以及显示用户当天的锻炼活动
静态快捷方式创建步骤:
1、在AndroidManifest中,找到 intent 过滤器设置为 android.intent.action.MAIN 操作和 android.intent.category.LAUNCHER 类别的 Activity。
2、向此 Activity 添加 <meta-data> 元素,该元素引用了定义应用快捷方式的资源文件
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
3、创建新的资源文件:res/xml/shortcuts.xml
4、
在这个新的资源文件中,添加 <shortcuts>
根元素,其中包含 <shortcut>
元素的列表。每个 <shortcut>
元素都包含有关一个静态快捷方式的信息,包括其图标、说明标签及其在应用内启动的 intent
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/lion_close"
android:shortcutShortLabel="shortcutShortLabel"
android:shortcutLongLabel="shortcutLongLabel"
android:shortcutDisabledMessage="shortcutDisabledMessage">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.wiik.testdemo"
android:targetClass="com.example.wiik.testdemo.screem.TestTwoWindowActivity" />
<!-- 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" />
<capability-binding android:key="actions.intent.CREATE_MESSAGE" />
</shortcut>
<!-- Specify more shortcuts here. -->
</shortcuts>
一个shortcut就是一个快捷入口。
关键字介绍:
须为 android:shortcutId
和 android:shortcutShortLabel
提供值。其他所有的值均为可选。
1、android:shortcutId
定义一个id,表示 ShortcutManager 对象对其执行操作时的快捷方式。
2、android:shortcutShortLabel
这是用于简短说明快捷方式用途的词组。请尽可能将快捷方式的“简短说明”的长度限制在 10 个字符以内
3、android:shortcutLongLabel
这是用于详细说明快捷方式用途的词组。如果空间足够大,启动器会显示此值,而不是 android:shortcutShortLabel
。 请尽可能将快捷方式的“详细说明”的长度限制在 25 个字符以内。
4、android:shortcutDisabledMessage
这是当用户尝试启动已停用的快捷方式时出现在支持的启动器中的消息。此消息应向用户解释快捷方式现在停用的原因。 如果 android:enabled
为 true
,则此属性的值无效。
5、android:enabled
这用于确定用户是否能够与支持的启动器中的快捷方式进行交互。 android:enabled
的默认值为 true
。 如果您将其设置为 false
,则还应设置 android:shortcutDisabledMessage
,用于说明停用该快捷方式的原因。如果您认为自己不需要提供此类消息,最简单的做法就是从 XML 文件中完全移除该快捷方式。
6、android:icon
这是启动器向用户显示快捷方式时所用的位图或自适应图标。此值可以是某个图片的路径,也可以是包含相应图片的资源文件。请尽可能使用自适应图标来提高性能和一致性。
配置内部元素
7.action节点
这个action是启动目标页的配置信息。和我们正常启动一个页面一样
7.1、android:action:启动方式
7.2、android:targetPackage:目标包名
7.3、android:targetClass:目标类
8、categories
这用于为应用的快捷方式所执行的各类操作(如创建新的聊天消息)提供分组。
如需查看支持的快捷方式类别的列表,请参阅 ShortcutInfo
类参考文档。
9、capability-binding
声明与此快捷方式关联的功能。
2、创建动态快捷方式
动态快捷方式提供指向应用内特定的上下文相关操作的链接。这些操作可能会在应用的不同使用场景间发生变化,甚至会在应用运行时发生变化。适合使用动态快捷方式的用例包括致电特定人员、导航到特定位置,以及从用户的上一个存档点加载游戏
ShortcutManagerCompat Jetpack 库是 ShortcutManager API 的帮助程序,可让您管理应用中的动态快捷方式。使用 ShortcutManagerCompat 库可减少样板代码
ShorcutManagerCompat
API 让您的应用可以通过动态快捷方式执行以下操作:
- 推送和更新:使用
pushDynamicShortcut()
发布和更新动态快捷方式。如果已经存在具有相同 ID 的动态快捷方式或固定快捷方式,那么每个可变快捷方式都会更新。
- 移除:使用
removeDynamicShortcuts()
移除一组动态快捷方式,或使用removeAllDynamicShortcuts()
移除所有动态快捷方式。
val shortcut = ShortcutInfoCompat.Builder(context, "myshortcutid")
.setShortLabel("Website")
.setLongLabel("Open the website")
.setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
.setIntent(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://www.abc.com/")
)
)
.build()
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
库的引用:
dependencies {
implementation "androidx.core:core:1.6.0"
implementation 'androidx.core:core-google-shortcuts:1.0.0'
}
3.创建固定快捷方式
在 Android 8.0(API 级别 26)及更高版本中,您可以创建固定快捷方式。与静态和动态快捷方式不同,固定快捷方式在受支持的启动器中显示为单独的图标
要将快捷方式固定到使用您的应用的受支持启动器上,请按顺序完成以下一系列步骤:
1、使用 isRequestPinShortcutSupported() 验证设备的默认启动器是否支持应用内固定快捷方式。
2、使用以下两种方式之一创建 ShortcutInfo 对象,具体采用哪种方式取决于是否已存在相应快捷方式:
2.1:如果已存在相应快捷方式,请创建仅包含现有快捷方式 ID 的 ShortcutInfo
对象。系统会自动找到与该快捷方式相关的所有其他信息,并将其固定。
2.2:如果您要固定原本不存在的新快捷方式,请创建包含新快捷方式 ID、intent 和简短标签的 ShortcutInfo
对象。
3、尝试通过调用 requestPinShortcut() 将快捷方式固定到设备的启动器上。在此过程中,您可以传入一个 PendingIntent 对象,用于仅在快捷方式成功固定后通知您的应用。
快捷方式固定后,您的应用可以使用 updateShortcuts() 方法更新其内容。
@RequiresApi(Build.VERSION_CODES.O)
fun update(context: Context)
{
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
if (shortcutManager!!.isRequestPinShortcutSupported) {
val pinShortcutInfo = ShortcutInfo.Builder(context, "shortcutid").build()
val pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo)
val successCallback = PendingIntent.getBroadcast(context, /* request code */ 0,
pinnedShortcutCallbackIntent, /* flags */ 0)
shortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.intentSender)
}
}
添加能力:capability
capability这个属于我们自定义,或者可以借助系统自带的。capability
取决于要实现的功能以及用户请求中包含的实际字词
通过以上的配置,我们已基本完成快接入口的。