Android开发Android技术知识Android开发

Android App Shortcuts使用说明(长按快捷方式

2018-09-27  本文已影响20人  Yun丶Lei

Shortcut

其中App Shortcuts是指在桌面长按app图标而出现的快捷方式, 可以为你的app的关键功能添加更快速的入口而不用先打开app,点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置, 变成单独的桌面快捷方式.

典型应用

支付宝&腾讯新闻(每次虽然国内跟进的晚,但是阿里腾讯也算是最早跟进的一批了)


支付宝
腾讯新闻

使用方式

两种方式使用

  • 静态的: 在xml中定义, 适用于一些通用的动作.
  • 动态的: 由ShortcutManager发布, 可以根据用户的行为或者偏好添加, 可以动态更新.

静态使用

在应用的Manifest中启动Activity上添加meta-data

<activity android:name=".MainActivity">
    <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>

然后在res/xml/ 目录下创建 shortcuts.xml文件, 里面包含静态的shortcuts:

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

    <shortcut
        android:enabled="true"
        android:icon="@mipmap/icon1"
        android:shortcutDisabledMessage="@string/static_message"
        android:shortcutId="static1"
        android:shortcutLongLabel="@string/static_long_label_1"
        android:shortcutShortLabel="@string/static_short_label_1">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.githubly.shortcutsdemo.StaticTestActivity"
            android:targetPackage="com.githubly.shortcutsdemo" />
    </shortcut>

    <shortcut
        android:enabled="true"
        android:icon="@mipmap/icon2"
        android:shortcutDisabledMessage="@string/static_message"
        android:shortcutId="static2"
        android:shortcutLongLabel="@string/static_long_label_2"
        android:shortcutShortLabel="@string/static_short_label_2">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.githubly.shortcutsdemo.StaticTestActivity"
            android:targetPackage="com.githubly.shortcutsdemo" />
    </shortcut>

</shortcuts>

就这样就可以简单的创建了两个静态的Shortcut,targetClass 表示点击快捷方式跳转的页面


静态注册

动态使用

动态的shortcuts可以在用户使用app的过程中构建, 更新, 或者删除.
使用ShortcutManager可以对动态shortcuts完成下面几种操作:

  • Publish发布: setDynamicShortcuts(), addDynamicShortcuts(List);
  • Update更新: updateShortcuts(List);
  • Remove删除: removeDynamicShortcuts(List), removeAllDynamicShortcuts().

创建ShortcutInfo

private fun addShortcutWithIntent1(): ShortcutInfo? {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        ShortcutInfo.Builder(this, "Dynamic1").apply {
            setShortLabel("动态快捷1")
            setLongLabel("DynamicShortcutLong1")
            setIcon(Icon.createWithResource(this@MainActivity, R.mipmap.icon3))
            setIntent(Intent().apply {
                action = Intent.ACTION_MAIN
                setClass(this@MainActivity, DynamicTestActivity::class.java)
                putExtra("info", "Dynamic shortcuts target class with intent1")
            })
        }.build()
    } else {
        null
    }
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val shortcutManager = getSystemService(ShortcutManager::class.java)

    val count = shortcutManager.maxShortcutCountPerActivity
    Log.e("count",count.toString())

    val list = mutableListOf<ShortcutInfo>()
    addShortcutWithIntent1()?.let {
        list.add(it)
    }
    /*addShortcutWithIntent2()?.let {
        list.add(it)
    }*/
    addShortcutWithIntents()?.let {
        list.add(it)
    }
    shortcutManager.dynamicShortcuts =list
}

多个Intent构建back stack

动态的shortcut仍然可以用多个Intent来指定一个back stack, 那么打开目标Activity之后就可以返回到应用中的指定界面而不是回到launcher:

private fun addShortcutWithIntents(): ShortcutInfo? {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        ShortcutInfo.Builder(this, "Dynamic3").apply {
            setShortLabel("动态快捷3")
            setLongLabel("DynamicShortcutLong3")
            setIcon(Icon.createWithResource(this@MainActivity, R.mipmap.icon5))
            setIntents(arrayOf(
                    Intent().apply {
                        action = Intent.ACTION_MAIN
                        setClass(this@MainActivity, MainActivity::class.java)
                        flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
                    },
                    Intent().apply {
                        action = Intent.ACTION_MAIN
                        setClass(this@MainActivity, DynamicTestActivity::class.java)
                        flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
                        putExtra("info", "Dynamic shortcuts target class with intents")
                    }
            )
            )
        }.build()
    } else {
        null
    }
}

动态添加


动态添加

shortcut数量

val count = shortcutManager.maxShortcutCountPerActivity
Log.e("count",count.toString())

目前虽然说是 5 个,但实际最多只能添加 4 个(最多添加 4 个 Shortcuts 以保持在启动器中显示的样式最佳)

如图实际是静态两个加上动态三个实际上只显示了四个


数量问题

疑问?

静态使用 长按后显示的是android:shortcutLongLabel的值,如果不设置android:shortcutLongLabel则显示android:shortcutShortLabel

动态使用 长按后显示的是setShortLabel的值

github地址 ShortcutsDemo

上一篇下一篇

猜你喜欢

热点阅读