持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
前言
现如今很多大厂的应用程序我们都可以从中看到快捷方式的操作,如微信、支付宝、淘宝等App在长按图标的时候就会出现操作栏。让我们需要引导用户快速导航到App而无需经历一次漫长的操作过程时,它们的功能价值就非常有用了。针对这一点的实现并不复杂,只需要添加一些配置即可。
权限添加
创建桌面快捷方式也需要声明权限,不然不能正确在桌面创建快捷方式。部分手机需要动态获取这两个权限。
<!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 移除快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
复制代码
静态快捷方式
通过静态创建的快捷方式不会随应用数据的改变而改变的,提供指向应用内常规操作的链接。
- 让我们首先在下面创建一个
res/xml
文件夹,然后再创建一个名为shortcuts.xml
. 可以随意命名此文件。 - 在
xml
中使用<resources></resources>
标签和标签,所有的静态快捷方式都将在这里定义。 - 在使用
<shortcut><shortcut/>
标签来定义静态的快捷方式。每个快捷方式都需要一个shortcutId
和一个shortcutShortLabel
。 - 我们需要定义一个
<intent><intent/>
标签,是用来使快捷方式能够快速进入应用程序。
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="main_shortcut" // `ShortcutManager` 对象对其执行操作时的快捷方式
android:enabled="true"
android:icon="@drawable/ic_logo"
android:shortcutShortLabel="我是快捷方式简短说明" // 尽可能将快捷方式的“简短说明”的长度限制在 10 个字符以内
android:shortcutLongLabel="我是快捷方式详细说明"> // 尽可能将快捷方式的“详细说明”的长度限制在 25 个字符以内。
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.demo"
android:targetClass="com.example.demo.MainActivity">
// extra 传递的参数
<extra android:name="shortcut_key" android:value="我是快捷方式传递的数据!" />
</intent>
</shortcut>
</shortcuts>
复制代码
当用户点击显示的快捷方式时,将向 MainActivity
发送一个 Intent
,其中包含 shortcut_key
和额外的字符串我是快捷方式传递的数据
- 在
MainActivity
中检索extra
val shortcutExtra = intent.getStringExtra("shortcut_key") ?: ""
textView.text = shortcutExtra
复制代码
- 不要忘记在您的AndroidManifest.xml. 您必须在启动器活动声明中添加快捷方式配置。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo">
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 向此 Activity 添加 <meta-data> 元素,该元素引用了定义应用快捷方式的资源文件 -->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
</application>
</manifest>
复制代码
动态快捷方式
除了静态快捷方式,您可能还想创建一些数据依赖于网络调用的快捷方式。在 WhatsApp 中,您有 3 个最近聊天的快捷方式——它们总是在变化。在这种情况下,您可能希望通过代码指定快捷方式。
fun addShortcut() {
val shortcutManager = getSystemService(context, ShortcutManager::class.java)
val activitys = ShortcutInfo.Builder(context, "main_shortcut")
.setShortLabel("我是快捷方式简短说明")
.setIntents(arrayOf(
Intent(Intent.ACTION_VIEW, null, context, MainActivityA::class.java),
Intent(Intent.ACTION_VIEW, null, context, MainActivityB::class.java)
))
.build()
shortcutManager!!.dynamicShortcuts = listOf(activitys)
}
复制代码
ShortcutInfoCompat库
Jetpack 库ShortcutInfoCompat
是对 ShortcutManager
API 的扩展,推荐使用。主要是为了使用少量的代码来管理快捷方式,减少样板代码的产生。主要有两个API的使用:
- 推送和更新:使用
pushDynamicShortcut()
发布和更新动态快捷方式。如果已经存在具有相同ID
的动态快捷方式或固定快捷方式,那么每个可变快捷方式都会更新。 - 移除:使用
removeDynamicShortcuts()
移除一组动态快捷方式,或使用removeAllDynamicShortcuts()
移除所有动态快捷方式。
示例:
val shortcut = ShortcutInfoCompat.Builder(context, "main_shortcut")
.setShortLabel("我是快捷方式简短说明")
.setLongLabel("我是快捷方式详细说明")
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_logo))
.setIntent(Intent(context,MainActivityB::class.java))
.build()
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
复制代码