草庐IT

Android App桌面长按菜单展示快捷操作

i小灰 2023-03-28 原文

[转载文章]

长按桌面图标展示快捷方式,今时看来,早已司空见惯,一是Android很早的版本就已经支持,二是大部分的应用也已经实现,像微信,支付宝,头条等,所以无论功能还是实现方式,都已经踊跃出了大量的技术博文,但细细看去,却很少有一个统一的流程及具体的实现方案,本文针对此功能做了细致的总结,一是,便于日后开发的需要,二是,希望可以帮助到有类似需求的小伙伴。

这个特性,可以追溯到Android 7.1,也就是在7.1之后的系统,如果app支持,可以通过长按app图标展示一些快捷操作,如下图:


相信上图中的功能,大家都见过,那么如何实现呢?Android API当中给出了两种实现方式,一种是静态,一种是动态。

静态方式:

静态的方式,需要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_launcher"
        android:shortcutId="test_0"
        android:shortcutShortLabel="@string/app_test_0">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.abner.widget.Test0Activity"
            android:targetPackage="com.abner.widget" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>

    <shortcut
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutId="test_1"
        android:shortcutShortLabel="@string/app_test_1">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.abner.widget.Test1Activity"
            android:targetPackage="com.abner.widget" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>
</shortcuts>

外层首先一个shortcuts标签, 里面就是包裹着一个一个快捷方式shortcut,你需要几个,就创建几个,上面代码中我是创建了两个,可以发现这些属性和我们清单文件里的Activity里的属性类似,这里简单概述一下:

enabled, 表示这个shortcut是否可用
icon 为快捷图标
shortcutId, 快捷方式唯一的id
shortcutShortLabel, 短名称
shortcutLongLabel, 这里是配置的长名称, launcher会优先选择长名称显示,显示不下会选择短名称
categories 为应用程序的快捷方式执行的操作类型提供分组,例如创建新的聊天消息
capability-binding 可选 声明与此快捷方式关联的功能。CREATE_MESSAGE 声明的功能,是与应用有关的 Action 内置 intent。用户可以结合使用语音指令与 Google 助理来调用此快捷方式。

在shortcut标签下,还有一个intent标签,不用说,想必大家也知道了它的作用,就是点击快捷方式,跳转的目标。

intent, 这里表示我们点击shortcut时要干嘛,
targetPackage是指定一个目标应用的包名,
targetClass是我们要跳转的目标类, 这里要注意的是android:action一定要配置, 否则会崩溃
categories, 这个东西目前位置官方只给提供了android.shortcut.conversation

第二步,清单文件AndroidManifest里进行配置,这个需要注意一下:只能在有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER的Activity中配置才有效,说简单点,也就是应用的主入口。

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

以上两步完成之后,我们就可以运行程序,效果如下:


动态方式:

上述的过程,我们实现了静态的快捷方式,但常见的需求情况下,有很多是需要动态配置的,那么如何实现呢?其实也非常简单,目前动态的方式创建其中,也有两种代码方式,一种是通过ShortcutManagerCompat来实现,一种是ShortcutManager,两种方式大同小异,我们一起来看下:

ShortcutManagerCompat方式实现:
添加:

//动态方式添加一
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val shortScan = ShortcutInfoCompat.Builder(this, "test_2")//唯一标识id
        .setShortLabel(getString(R.string.app_test_2))//短标签
        .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))//图标
        //跳转的目标,定义Activity
        .setIntent(Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java))
        .build()
    //执行添加操作
    ShortcutManagerCompat.addDynamicShortcuts(this, mutableListOf(shortScan))

    toast("已添加")
}

添加后效果对比


更新:

//动态更新方式一
val shortScan = ShortcutInfoCompat.Builder(this, "test_2")//唯一标识id
    .setShortLabel(getString(R.string.app_test_2_updata))//更新一个短标签
    .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))//图标
    //要跳转的目标
    .setIntent(Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java))
    .build()
//执行更新操作
ShortcutManagerCompat.updateShortcuts(this, mutableListOf(shortScan))

toast("已更新")

更新前后效果对比

删除:

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

删除后效果

ShortcutManager方式实现:
添加:

//动态方式添加二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val info = ShortcutInfo.Builder(this, "test_3")//唯一标识id
        .setShortLabel(getString(R.string.app_test_3))//短的标签
        .setLongLabel(getString(R.string.app_test_3_long))//长的标签
        .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))//图标
        .setIntent(intent)//跳转的目标,这里我设置的是当前
        .build()
    //执行添加操作
    getSystemService(ShortcutManager::class.java)
        .dynamicShortcuts = mutableListOf(info)

    toast("已添加")
}

删除:

//动态移除方式二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    getSystemService(ShortcutManager::class.java)
        .removeDynamicShortcuts(listOf("test_3"))//唯一的id标识
    toast("已移除")
}

更新:

//动态更新方式二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val info = ShortcutInfo.Builder(this, "test_3")//唯一标识id
        .setShortLabel(getString(R.string.app_test_3_updata))//更新一个短标签
        .setLongLabel(getString(R.string.app_test_3_long))//长标签
        .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))//图标
        .setIntent(intent)//跳转的目标,这里我设置的是当前
        .build()
    //执行更新操作
    getSystemService(ShortcutManager::class.java).updateShortcuts(listOf(info))

    toast("已更新")
}

上述的代码中,注释已经很清楚了,这里就不细讲,效果呢和第一种方式类似,这里就不贴效果了,大家感兴趣的话,可以直接看源码,地址是:
https://github.com/AbnerMing888/AndroidWidget

有关Android App桌面长按菜单展示快捷操作的更多相关文章

  1. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  2. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  3. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  4. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  5. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  6. ruby - Ruby 中的选项菜单 - 2

    我正在尝试在Ruby中创建一个菜单,以便根据用户输入的内容,取决于调用的类。然后在这种情况下它将返回到“Main”或类“Options”。我希望有人能帮助我。这是我的代码。modulePhysicsG=21C=20000Pi=3.14D=100endclassOptionsputs"Pleaseselect1forAccelerationand2forEnergy."option=gets()ifoption==1thenputs"AccelCalc"#ThisisthebitthatneedstodirecttheusertotheclassAccelCalcelseputs"Ene

  7. Postman测试简单操作 - 2

    1、接口请求基本操作1.1例子tips在view的选项可以zoomin调整窗口字帖大小。1、创建一个测试的workspace,并命名为test2、test后面新增一个addrequest3、选择发送GET,URL为一个开源的https://api.apiopen.top/api/sentences获取每日一句4、点击send查看内容Tips:如果提示出现Error:tunnelingsocketcouldnotbeestablished,statusCode=407错误,参照以下解决办法)关于tunnelingsocketcouldnotbeestablished,cause=getaddri

  8. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  9. ruby - Ruby 语言可以用来构建操作系统吗? - 2

    Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby​​解释器作为独立内核加载到内存中。一旦ruby​​解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大

  10. ruby-on-rails - JSON 对象操作 - 2

    假设我们有以下描述一个人的JSON对象:{"firstName":"John","lastName":"Smith","age":25,"address":{"streetAddress":"212ndStreet","city":"NewYork","state":"NY","postalCode":"10021"},"phoneNumber":[{"type":"home","number":"212555-1234"},{"type":"fax","number":"646555-4567"}]有人可以建议在Rails3中操作前一个对象的最优雅和最有效的方法吗?我希望能够:添加另

随机推荐