为Android应用创建快捷方式

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前言

现如今很多大厂的应用程序我们都可以从中看到快捷方式的操作,如微信、支付宝、淘宝等App在长按图标的时候就会出现操作栏。让我们需要引导用户快速导航到App而无需经历一次漫长的操作过程时,它们的功能价值就非常有用了。针对这一点的实现并不复杂,只需要添加一些配置即可。

权限添加

创建桌面快捷方式也需要声明权限,不然不能正确在桌面创建快捷方式。部分手机需要动态获取这两个权限。

   <!-- 添加快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
     
    <!-- 移除快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
复制代码

静态快捷方式

通过静态创建的快捷方式不会随应用数据的改变而改变的,提供指向应用内常规操作的链接。

  1. 让我们首先在下面创建一个res/xml文件夹,然后再创建一个名为shortcuts.xml. 可以随意命名此文件。
  2. xml中使用<resources></resources>标签和标签,所有的静态快捷方式都将在这里定义。
  3. 在使用<shortcut><shortcut/>标签来定义静态的快捷方式。每个快捷方式都需要一个shortcutId和一个shortcutShortLabel
  4. 我们需要定义一个<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和额外的字符串我是快捷方式传递的数据

  1. MainActivity中检索 extra
val shortcutExtra = intent.getStringExtra("shortcut_key") ?: "" 
textView.text = shortcutExtra
复制代码
  1. 不要忘记在您的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)
复制代码

猜你喜欢

转载自juejin.im/post/7110609150479958053
今日推荐