一、背景
长按桌面图标完结方便办法最早是iOS供给的功用,而Android最早在Android 7.1版本也供给了对这方面的支撑,所以在短时间内,像微信,支付宝,头条等流量级运用都供给了这方面的支撑,如下图。
现在,长按桌面图标方便办法已经是很老练的功用,完结上也比较简单,首要用到的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" />
完结上述操作后,我们就能够答应工程代码了,作用如下。
三、动态办法
静态方便办法适合毕竟固定的场景,假如方便办法需求动态装备,那么就需求用到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;
到此,方便办法的静态和动态增加办法就介绍完结了。