Android桌面图标快捷方式

逻辑寻星者
• 阅读 2003

Android桌面图标快捷方式

一、背景

长按桌面图标实现快捷方式最早是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;

到此,快捷方式的静态和动态添加方式就介绍完成了。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
菜鸟阿都 菜鸟阿都
4年前
ubuntu删除桌面快捷方式图标
前言:安装ubuntu2.04后,桌面上会出现个人文件夹、回收站图标快捷图标,如下图。个人比较喜欢干净的桌面,所以想删除桌面自带的这两个快捷方式,实践之后将方法总结和分享一下。步骤一、安装gnometweakslanguagesudoaptgetinstallgnometweaks步骤二、通过快捷键【Altf2】开启优化程序打开扩展桌面图标选项
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
java一生之敌 java一生之敌
3年前
JVM的内存模型和优化方式
一、JVM的内存模型1.!图片(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/52b2220f04010eb329efbef966f9fa40.png)其中s0,s1为幸
梦
5年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
4年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
4年前
IOS仿桌面拖动桌面图标
手势拖动UIPanGestureRecognizerpanGestureRecognizerUIPanGestureRecognizerallocinitWithTarget:self
GeorgeGcs GeorgeGcs
8个月前
【HarmonyOS 5】桌面快捷方式功能实现详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。鸿蒙系统提供的桌面快捷方式(Shortcuts)功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用