一、背景

长按桌面图标完结方便办法最早是iOS供给的功用,而Android最早在Android 7.1版本也供给了对这方面的支撑,所以在短时间内,像微信,支付宝,头条等流量级运用都供给了这方面的支撑,如下图。

Android桌面图标快捷方式

现在,长按桌面图标方便办法已经是很老练的功用,完结上也比较简单,首要用到的Api就是ShortcutManager。而在具体完结方案上,Android 又给出了两种完结办法,一种是静态,一种是动态。

二、静态办法

静态办法需求运用xml资源,以shortcuts标签的形式引进。对于静态办法,我们首先需求在res目录的xml目录下创立一个xml资源文件,如下所示。

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@mipmap/ic_shortcut_scan"
        android:shortcutId="scan"
        android:shortcutShortLabel="扫一扫">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.xzh.app.ScanActivity"
            android:targetPackage="com.xzh.app" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.SCAN" />
    </shortcut>
    ... //省略其他代码
</shortcuts>

其间,运用静态办法常见的装备特点如下:

  • enabled:表明这个shortcut是否可用;
  • icon:为方便图标;
  • shortcutId:方便办法唯一的id;
  • shortcutShortLabel:短称号;
  • shortcutLongLabel:装备的长称号, launcher会优先选择长称号显现,显现不下会选择短称号;
    • categories:为运用程序的方便办法执行的操作类型供给分组
  • capability-binding:声明与此方便办法相关的功用。

除此之外,在shortcut标签下也有几个特点需求留意:

  • intent:点击shortcut时的方针页;
  • targetPackage:指定一个方针运用的包名;
  • targetClass:要跳转的方针类, 需求留意的是,android:action一定要装备,不然可能出现溃散;
  • categories:目前官方只给供给了android.shortcut.conversation;

完结上述操作后,接下来就是在清单文件AndroidManifest.xml里进行装备。具体来说,就是在AndroidManifest.xml的入口Activity中引进shortcuts资源。

<!--引进shortcuts资源-->
<meta-data
    android:name="android.app.shortcuts"
    android:resource="@xml/shortcuts" />

完结上述操作后,我们就能够答应工程代码了,作用如下。

Android桌面图标快捷方式

三、动态办法

静态方便办法适合毕竟固定的场景,假如方便办法需求动态装备,那么就需求用到ShortcutManagerCompat或ShortcutManager来完结。

3.1 ShortcutManagerCompat

下面是运用ShortcutManagerCompat完结动态方便办法的示例代码。

private fun initShortCut() {
    //动态办法增加
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        val shortScan = ShortcutInfoCompat.Builder(this, "scan")
            .setShortLabel(getString(R.string.short_cut_scan))
            .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_shortcut_scan))
            .setIntent(Intent(Intent.ACTION_MAIN, null, this, ScanActivity::class.java))
            .build()
        ShortcutManagerCompat.addDynamicShortcuts(this, mutableListOf(shortScan))
    }
}

假如需求更新方便办法,能够运用updateShortcuts办法,参考代码如下。

private fun updateShortCut() {
    val shortScan = ShortcutInfoCompat.Builder(this, "scan") 
        .setShortLabel(getString(R.string.short_cut_scan)) 
        .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_shortcut_scan)) 
        .setIntent(Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java))
        .build()
    ShortcutManagerCompat.updateShortcuts(this, mutableListOf(shortScan))
}

假如要删去方便办法,需求用到ShortcutManagerCompat的removeDynamicShortcuts删去办法,而且需求运用创立时的唯一id,参考代码如下。

//动态移除
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    ShortcutManagerCompat.removeDynamicShortcuts(
        this@MainActivity,
        Collections.singletonList("scan")//唯一标识id
    )
}

3.2 ShortcutManager

除了ShortcutManagerCompat办法外,我们还能够运用ShortcutManager来创立方便办法,如下所示。

private fun initShortCut() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        val info = ShortcutInfo.Builder(this, "scan") 
            .setShortLabel(getString(R.string.short_cut_scan)) 
            .setIcon(Icon.createWithResource(this, R.mipmap.ic_shortcut_scan)) 
            .setIntent(intent) 
            .build()
        getSystemService(ShortcutManager::class.java)
            .dynamicShortcuts = mutableListOf(info)
    }
}

假如需求更新方便办法,能够运用updateShortcuts办法,如下所示。

private fun updateShortCut() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        val info = ShortcutInfo.Builder(this, "scan") 
            .setShortLabel(getString(R.string.short_cut_scan)) 
            .setIcon(Icon.createWithResource(this, R.mipmap.ic_shortcut_scan)) 
            .setIntent(intent) 
            .build()
        getSystemService(ShortcutManager::class.java).updateShortcuts(listOf(info))
    }
}

假如要删去方便办法,能够运用removeDynamicShortcuts办法,如下所示。

private fun delShortCut() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        getSystemService(ShortcutManager::class.java)
            .removeDynamicShortcuts(listOf("scan")) 
    }
}

下面是ShortcutManager的常见办法:

  • setDynamicShortcuts():能够增加或替换所有的shortcut;
  • addDynamicShortcuts():来增加新的shortcut到列表中,超越最大个数会报反常
  • updateShortcuts(List shortcutInfoList):更新已有的动态方便办法;
  • removeDynamicShortcuts(List shortcutIds):依据动态方便办法的ID,删去已有的动态方便办法;
  • removeAllDynamicShortcuts():删去掉app中所有的动态方便办法;
  • getDynamicShortcuts():得到所有的动态shortcuts;

到此,方便办法的静态和动态增加办法就介绍完结了。