Android 应用快捷ShortcutManager与ShortcutManagerCompat详解与实战(二)

一、介绍

        之前我已通过一篇文章介绍了应用快捷的接入与Demo。如果还未看过上一篇的文章可以先了解入门。

传送门:Android 应用快捷(shortcut)功能的详解(一)_蜗牛、Z的博客-CSDN博客

有创建自然就会有管理,否则一个完美的方案不应该这么被推荐出来。如何管理才是使用的核心。

二、管理ShortcutManager

        创建快捷方式后,您需要在应用生命周期内对其进行管理。例如,您可能需要确定用户使用您的快捷方式完成特定操作的频率,以此来优化应用。在其他情况下,您可能会决定停用某个固定快捷方式,以防止应用执行过时或缺失的操作。

ShortcutManager与ShortcutManagerCompat是快捷的大管家,即使我们不通过xml去配置,也能通过代码去动态的完成。

                                动态创建ShortcutManagerCompat

ShortcutManagerCompat是动态创建快捷键,无须xml配置也可以,常见的比如我们在使用支付宝的时候,经常会提示将扫码和收款码添加到桌面。同时,我们也可以配合业务进行动态绑定

动态创建要求:

1.必须设置id

2.必须设置一个shortLabel

这两个是至少保证创建的条件

        val shortcut = ShortcutInfoCompat.Builder(context, "id")
            .setShortLabel("Shortlabel")
            .setLongLabel("Longbalel")
            .setIcon(IconCompat.createWithResource(context, R.mipmap.bg_11111))
            .setIntent(
                Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("https://www.baidu.com/")
                )
            )
            .build()

        ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

       创建一个shortCut,通过pushDynamicShortcut完成与更新。

intent:是点击的目标,如果没有设置,点击五反应。

API详解:

当我们拿到一个库,只有懂了方法,才能更好的处理异常场景。

1、public Builder(@NonNull Context context, @NonNull String id)

创建shortCut的对象。由于这里面创建的比较复杂,且需要的参数与封装的key以及是否符合业务需求,需要开发者自行查看原来

id:是当前要创建的shortCut的id,如果id已存在,新的内容会覆盖原来的

2、public static boolean pushDynamicShortcut(@NonNull final Context context, @NonNull final ShortcutInfoCompat shortcut)

创建与更新

如果当前ShortcutInfoCompat已存在,会更新当前内容,否则创建。是否存在是通过id来判断

3、isRequestPinShortcutSupported

检查是否支持固定快捷,在创建固定快捷的时候,先检查,否则会报错,或者出现异常情况

3、requestPinShortcut

创建固定快捷方式,这个方法在ShortcutManager也有,ShortcutManagerCompat调用了前者,两者创建是一样的。

ShortcutManagerCompat
ShortcutManager

 4、createShortcutResultIntent

创建固定快捷的Intent。

这个方法是给固定快捷方式使用,同样ShortcutManagerCompat是调用了ShortcutManager。在Jetpack组件中,ShortcutManagerCompat已对ShortcutManager进行了封装,也就是说,ShortcutManager中的API在ShortcutManagerCompat都有,接下来只讲ShortcutManagerCompat中出现,如果ShortcutManager没包括在内,将会在ShortcutManager的中进行介绍

5、public static List<ShortcutInfoCompat> getShortcuts(@NonNull final Context context, int matchFlags)

获取当前应用下的ShortCuts。这里面是区分来源的,

flag:

FLAG_MATCH_MANIFEST:静态创建的,通过xml导入

FLAG_MATCH_DYNAMIC:动态创建,通过代码push

FLAG_MATCH_PINNED:固定的,

int FLAG_MATCH_CACHED:缓存中的

通过不同的flag获取到对应的列表

6、public static boolean addDynamicShortcuts(@NonNull Context context, @NonNull List<ShortcutInfoCompat> shortcutInfoList)

动态添加,但是这个是批量,如果是单个构建好需要构建一个数组。同样,这个这种创建无法达到更新的效果,如果id已存在,会去覆盖

7、getMaxShortcutCountPerActivity

获取当前系统下支持最大快捷数,不同版本的支持也会不一样,所以在创建的时候还是加一下判断比较好,否则创建异常。

    public static int getMaxShortcutCountPerActivity(@NonNull Context context) {
        Preconditions.checkNotNull(context);
        return VERSION.SDK_INT >= 25 ? ((ShortcutManager)context.getSystemService(ShortcutManager.class)).getMaxShortcutCountPerActivity() : 5;
    }

8、isRateLimitingActive

判断系统是否受限制了,这个如果放回true,将不会执行创建,这个方法在push(创建的时候有进行校验)

9、getIconMaxWidth

获取icon的最大宽度

10、getIconMaxHeight

获取icon的最大高度

11、reportShortcutUsed

当构建完快捷应用,会通过id去通知或者报告这个user。在push中有调用

12、setDynamicShortcuts

动态添加,但是这个是批量,如果是单个构建好需要构建一个数组。同样,这个这种创建无法达到更新的效果,如果id已存在,会去覆盖

13、getDynamicShortcuts

获取动态创建的shortCut对象列表

14、updateShortcuts

批量更新

15、disableShortcuts

批量设置快捷不能使用或者失效

15、enableShortcuts

批量恢复快捷能够正常使用

16、removeDynamicShortcuts

批量移除动态创建的快捷

17、removeAllDynamicShortcuts

清空动态创建的快捷

18、removeLongLivedShortcuts

根据id删除长期使用的快捷,这个只能删除非固定的。

19、pushDynamicShortcut

动态添加或者更新单个快捷方式

三、分析

        通过以上关键的API的学习,我们可以发现,固定的除了能获取到列表,其他都是针对动态创建的一些东西。核心:查、插、删、更新、失效、恢复。

这里面还多东西都是重复的,所以只需要掌握几个核心的,其他都一样的

创建固定

        上方的API基本都是针对动态创建,那固定如何创建?其实固定创建和动态差不多,都是针对一个或者多个intent手势。但是固定是在桌面有一个自己的icon,类似一个app存在,但是也只是一个快捷键。疫情期间,支付宝经常提示将健康码添加到桌面,其实添加的就是健康码页面的快捷。定义一个固定的

固定创建步骤:

1.检查是否支持

isRequestPinShortcutSupported

2、构建一个ShortcutInfo

        val build = ShortcutInfo.Builder(context, id).build()

3、根据shortcutinfo创建结果的intent对象

createShortcutResultIntent

4、构建一个广播响应回调

val successCallback = PendingIntent.getBroadcast(
    context, /* request code */ 0,
    pinnedShortcutCallbackIntent, /* flags */ 0
)

5、创建固定快捷

shortcutManager.requestPinShortcut(
    pinShortcutInfo,
    successCallback.intentSender
)

完整的Demo:

    @RequiresApi(Build.VERSION_CODES.O)
    fun createLockDesk(context: Context, id: String, title: String, componentName: ComponentName) {
        val shortcutManager = context.getSystemService(ShortcutManager::class.java)


        if (shortcutManager!!.isRequestPinShortcutSupported) {
            val build = ShortcutInfo.Builder(context, id);
            build.setIcon(Icon.createWithResource(context, R.mipmap.launcher_icon_lion))//设置快捷图标
            build.setShortLabel(title)//设置title
            var intent = Intent()
            intent.action = Intent.ACTION_VIEW
//            intent.setClass(context, TestTwoWindowActivity::class.java)

            intent.setComponent(componentName)
            build.setIntent(intent)//设置跳转的intent

            val pinShortcutInfo = build.build()


            val pinnedShortcutCallbackIntent: Intent =
                shortcutManager.createShortcutResultIntent(pinShortcutInfo)


            val successCallback = PendingIntent.getBroadcast(
                context, /* request code */ 0,
                pinnedShortcutCallbackIntent, /* flags */ 0
            )


            shortcutManager.requestPinShortcut(
                pinShortcutInfo,
                successCallback.intentSender
            )
        }

    }

四、总结

通过以上学习,基本掌握了快捷创建

1、固定快捷:是类似一个独立的桌面icon,功能和其他两种是一样的

2、动态创建和静态创建

        静态如果被创建完,即使你当前移除,当应用被杀死后,再启动,又会创建,无法彻底删除。

        所以在创建非固定跨界,特别是xml静态,需要考虑是否有必要,如果非必要可采取动态创建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zemax Lumerical | 二维光栅出瞳扩展系统优化(下)

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展&#xff08;EPE&#xff09;系统优化和公差分析的仿真方法。 在这个工作流程中&#xff0c;我们将使用3个软件进行不同的工作 &#xff0c;以实现优化系统的大目标。首先&#xff0c;我们使用 Lumerical 构建光栅模型并使用…

数据库实验报告--安全性实验

一、 实验目的 &#xff08;1&#xff09;理解SQL Server验证用户身份的过程&#xff0c;掌握设置身份验证模式的方法。 &#xff08;2&#xff09;理解登录账号的概念&#xff0c;掌握混合认证模式下登录账号的建立与取消方法。 &#xff08;3&#xff09;掌握混合认证模式…

Centos7中mysql安装配置

前提&#xff1a;先关闭防火墙或开启tcp的3306端口 1、查看服务器上是否有现成的安装包 yum list mysql* 2、去mysql官网的yum资源库找到对应的rpm文件的下载链接 确定系统版本 cat /etc/redhat-release 到mysql官网复制对应版本的资源下载链接 MySQL :: Download MySQL Yum…

git Husky

虽然我们已经要求项目使用eslint了&#xff0c;但是不能保证组员提交代码之前都将eslint中的问题解决掉了&#xff1a; 也就是我们希望保证代码仓库中的代码都是符合eslint规范的&#xff1b; 那么我们需要在组员执行 git commit 命令的时候对其进行校验&#xff0c;如果不符合…

说说验证码功能的实现

前言 大家好&#xff0c;我是 god23bin&#xff0c;今天说说验证码功能的实现&#xff0c;相信大家都经常接触到验证码的&#xff0c;毕竟平时上网也能遇到各种验证码&#xff0c;需要我们输入验证码进行验证我们是人类&#xff0c;而不是机器人。 验证码有多种类型&#xff…

项目中使用es(一):使用springboot操作elasticsearch

使用springboot操作es 写在前面搭建项目环境和选择合适版本具体的代码实现&#xff08;1&#xff09;继承ProductInfoRepository具体的代码实现&#xff08;2&#xff09;使用ElasticsearchRestTemplate操作问题总结最后放个demo 写在前面 对于elasticsearch的搭建&#xff0c…

5款提高工作效率的无广告软件

今天推荐一些可以大幅度提升办公效率的小软件&#xff0c;安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告&#xff01; 1.照片处理——Darktable Darktable是一款用于处理和管理数码照片的工具。它可以让你对RAW格式的照片进行非破坏性的编辑,并提供多种模块和…

设计模式之~观察者模式

观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式。 观察者模式observer&#xff1a;定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使他们…

Linux系统下imx6ull QT编程—— C++构造函数、析构函数、this指针(四)

Linux QT编程 文章目录 Linux QT编程一、什么是构造函数&#xff1f;二、什么是析构函数&#xff1f;三、示例四、this指针 一、什么是构造函数&#xff1f; 构造函数在对象实例化时被系统自动调用&#xff0c;仅且调用一次。前面我们学过类&#xff0c;实际上定义类时&#x…

【Spring】— 动态SQL :<if>元素

动态SQL &#xff1a;元素 在MyBatis中&#xff0c;<if>元素是常用的判断语句&#xff0c;主要用于实现某些简单的条件选择。在实际应用中&#xff0c;我们可能会通过多个条件来精确地查询某个数据。 【示例8-1】下面通过一个具体的案例来演示元素的使用。 &#xff0…

基于RPC协议的接口自动化测试可以用Python语言实现

基于RPC协议的接口自动化测试可以用Python语言实现。下面是实现步骤&#xff1a; 1、安装依赖库&#xff0c;如protobuf、grpc。 2、编写.proto文件定义接口参数和返回值。 3、使用protoc编译.proto文件生成Python代码。 4、编写客户端代码调用远程接口进行测试。 具体实现…

数据结构与算法练习(三)二叉树

文章目录 1、树2、二叉树3、满二叉树4、完全二叉树5、二叉树的遍历&#xff08;前序、中序、后序&#xff09;二叉树删除节点或树 6、顺序存储二叉树顺序存储二叉树遍历&#xff08;前序、中序、后序&#xff09; 7、线索化二叉树中序线索二叉树前序线索二叉树后序线索二叉树 1…

悲观锁、乐观锁、自旋锁

悲观锁、乐观锁、自旋锁 &#xff08;1&#xff09;乐观锁 乐观锁是一种乐观的思想&#xff0c;即认为读多写少&#xff0c;遇到并发的可能性低&#xff0c;每次拿数据时都认为别人不会修改&#xff0c;所以不会上锁&#xff0c;但是在更新的时候会判断一下在此期间别人有没有…

开源赋能 普惠未来|中软国际寄语 2023 开放原子全球开源峰会

中软国际作为行业领先的全球化软件与信息技术服务企业及数字化转型服务商&#xff0c;近年来积极布局开源生态&#xff08;OpenHarmony、openEuler&#xff09;、智能云、ERP、AIGC、教育科技、智能车六大赛道&#xff0c;加速业务转型创新。 中软国际为开放原子开源基金会白金…

力扣---二叉树OJ题(多种题型二叉树)

文章目录 前言&#x1f31f;一、剑指 Offer 55 - I. 二叉树的深度&#x1f30f;1.1 链接&#xff1a;&#x1f30f;1.2 代码一&#xff1a;&#x1f30f;1.3 代码二&#xff1a;&#x1f30f;1.4 流程图&#xff1a; &#x1f31f;二、100. 相同的树&#x1f30f;2.1 链接&…

【ChatGPT】ChatGPT快速生成短视频

1.chatGPT剪映 chatGPT生成文本后通过剪映图文成片 这次用了new bing&#xff1a;Chatbot AI 在线网页版 (atmob.cn) 打开剪映-图文成片 把new bing生成的文本粘贴过来&#xff0c;点击生成视频。 生成好了&#xff0c;是这样 剪映自动生成的&#xff0c;最后还是得手工改改&…

Linux4.4网页与安全优化

文章目录 计算机系统5G云计算第一章 LINUX Apache网页与安全优化一、网页压缩1.检查是否安装 mod_deflate 模块2.如果没有安装mod_deflate 模块&#xff0c;重新编译安装 Apache 添加 mod_deflate 模块3.配置 mod_deflate 模块启用4.检查安装情况&#xff0c;启动服务5.测试 mo…

06 Redis分布式锁

常见面试问题 Redis除了拿来做缓存&#xff0c;你还见过基于Redis的什么用法&#xff1f;Redis 做分布式锁的时候有需要注意的问题&#xff1f;如果是 Redis 是单点部署的&#xff0c;会带来什么问题&#xff1f;那你准备怎么解决单点问题呢&#xff1f;集群模式下&#xff0c…

MySQL函数

日期函数 获得年月日&#xff1a; select current_date(); ---------------- | current_date() | ---------------- | 2017-11-19 | ----------------获得时分秒&#xff1a; select current_time(); ---------------- | current_time() | ---------------- | 13:51:21 …

SpringCloud:分布式缓存之Redis哨兵

Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1.哨兵原理 1.1.集群结构和作用 哨兵的结构如图&#xff1a; 哨兵的作用如下&#xff1a; 监控&#xff1a;Sentinel会不断检查您的master和slave是否按预期工作自动故障恢复&#xff…