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

news2024/11/15 20:00:13

一、介绍

        之前我已通过一篇文章介绍了应用快捷的接入与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静态,需要考虑是否有必要,如果非必要可采取动态创建。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红黑树的 概念性质 和 详解实现(插入旋转等)

文章目录 概念满足的条件性质实现红黑树的定义红黑树节点插入操作情况一情况二情况三Insert()总代码 其余操作左右单旋RotateL 左单旋RotateR 右单旋prevCheck 红黑树性质检测isBalance 红黑树平衡判断InOrder 中序遍历 完整代码 概念 红黑树&#xff0c;是一种二叉搜索树&…

HNU-操作系统OS-ucoreLab系列-感悟

谨以此片篇,献给熬夜的8个晚上,以及逝去的时光。 感悟: 今天结束了所有的Lab实验(2023.6.3),感慨万千。 喜是这个实验终于结束了,悲是其实有好多地方我都没有理解。 应该指出,由于验收的助教学长学姐们的宽容,HNU实际上在验收这一块的要求还是比较低的。 但是这个…

第三章 Electron 使用Koa以及Koa-Router

一、Koa是什么 &#x1f447; &#x1f447; &#x1f447; 据网上的资料显示&#xff0c;Koa 是下一代的 Node.js 的 Web 框架。是express原班人马打造,同样用于构建服务端web application的。旨在提供一个更小型、更富有表现力、更可靠的 Web 应用和 API 的开发基础。扯这些…

在输入URL后,前端浏览器的工作流程

这是一个经久不衰的面试题&#xff0c;整理一下。 浏览器 浏览器是一个多进程的架构。 主进程&#xff1a;主要适用于界面的显示&#xff0c;用户的交互&#xff0c;子进程管理。 渲染进程&#xff1a;将HTML&#xff0c;css&#xff0c;JS转换成页面&#xff0c;V8引擎以及…

redisson 随笔 0-入门

0. 虽说时运不佳&#xff0c;仍欲提桶跑路 分布式锁的常见实现方案 常用锁的用例 runoob Lua教程 对于分布式锁的实现方案&#xff0c;本文如标题所言&#xff0c;简单梳理了redisson的实现方案 redisson 也是基于redis的多个命令组合来实现的&#xff0c;为保证执行多个命…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升&#xff0c;不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (…

F. Editorial for Two(二分答案+反悔贪心)

F. Editorial for Two&#xff08;二分答案反悔贪心&#xff09; F. Editorial for Two 1、问题 给定一个 n n n和 k k k&#xff0c;以及一个长度为 n n n数组。现在从 n n n个数中&#xff0c;挑出 k k k个数&#xff0c;称作个子序列。然后将这个子序列分成两部分&#x…

干翻Mybatis源码系列之第八篇:Mybatis二级缓存的创建和存储

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

C++之---树/数据结构

一、树 什么是树&#xff1f; 1.1 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。n0时称为空树。在任意一棵非空树中&#xff1a; &#xff08;1&#xff09; 有且仅有一个特定的称为根&#xff08;Root&#xff09;的结点&#xff1b; &am…

CodeForces..最新行动.[中等].[遍历].[判断]

题目描述&#xff1a; 题目解读&#xff1a; "最近操作"字段会显示最近操作的n个文件。 最初有编号文件1&#xff0c;2&#xff0c;... n在"最近操作"字段&#xff0c;还有其他无限多个文件不在。 当某个文件pi发生操作时&#xff1a; 如果它位于“最近…

小红书账号矩阵优化软件

小红书账号矩阵优化软件 大家有关注过品牌在⼩红书上的打法有哪些吗&#xff1f; #品牌营销#小红书运营#爆文拆解#品牌投放#爆品打造 我们如果确定了我们要去做小红书&#xff0c;那我到底该怎么去做&#xff1f;现在小红书对我们目前这些品牌来说&#xff0c;你们是作为把它…

Allegro16.6详细教程(二)

R.3-D Viewer 3-D Viewer,可以直接在allegro中看到board file的3-D顯示效果。3-D Viewer對於PCB Editor Products,只有環境變數中的OpenGL顯示功能開啟後才有效,而對於APD/SiP是無效的。 2.3-D viewer是在一個獨立的視窗中打開的。3-D environment環境支援多種顯示內容的過…

Spring Cloud Alibaba - Nacos源码分析(二)

目录 一、Nacos服务端服务注册 1、服务端调用接口 2、服务注册 instanceServiceV2.registerInstance EphemeralClientOperationServiceImpl.registerInstance ServiceManager clientManager Client实例AbstractClient ClientOperationEvent.ClientRegisterServiceEven…

2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛圆满举行!

2023年5月27-28日&#xff0c;由腾扬广告、Channel[V]、盛娱星汇联合主办的2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛在广州番禺天河城正式打响&#xff0c;自广州赛区赛事启动以来&#xff0c;汇集了近五千名音乐人参与其中&#xff0c;历经2个多月、超40场…

【数据库复习】第七章 数据库设计

数据库设计的过程(六个阶段) ⒈需求分析阶段 准确了解与分析用户需求&#xff08;包括数据与处理&#xff09; 最困难、最耗费时间的一步 ⒉概念结构设计阶段 整个数据库设计的关键 通过对用户需求进行综合、归纳与抽象&#xff0c;形成一个独立于具体DBMS的概念模型 ⒊…

基于微信小程序蛋糕店商城管理系统的设计与实现

1&#xff1a;后端采用技术 SpringBoot 、Mybatis、Mybatis-plus、Redis、阿里云短信息服务、Hutool 邮箱服务、WebSocket通讯服务、OSS对象存储服务、支付宝沙箱服务&#xff0c;接口简单限流、简单定时任务。。。。。。 2&#xff1a;前端采用技术 Vue2、Vue2-uploader组件、…

[图表]pyecharts模块-日历图

[图表]pyecharts模块-日历图 先来看代码&#xff1a; import random import datetimeimport pyecharts.options as opts from pyecharts.charts import Calendarbegin datetime.date(2017, 1, 1) end datetime.date(2017, 12, 31) data [[str(begin datetime.timedelta(d…

Leetcode 110-平衡二叉树

1. 递归法求解 递归三部曲&#xff1a; 确定递归函数的参数及其返回值确定终止条件确定单层递归逻辑 深度&#xff1a;从上往下 高度&#xff1a;从下往上 1.1 根据深度求解 构建求二叉树节点深度的函数&#xff08;后序遍历&#xff09;递归求该树是否是平衡二叉树&#…

国产化麒麟linux系统开发编译常见问题汇总

团队自研股票软件关注威信龚总号&#xff1a;QStockView&#xff0c;下载 1 问题处理 1.1 Unknown module in QT:QJsonDocument 缺少QJsonDocument 解决方法&#xff1a; Pro文件中加上 QTcore; 播放器库问题 1.2 代码中汉字乱码需要设置文件编码格式 原因分析&…

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?

2023-06-03&#xff1a;redis中pipeline有什么好处&#xff0c;为什么要用 pipeline&#xff1f; 答案2023-06-03&#xff1a; Redis客户端执行一条命令通常包括以下四个阶段&#xff1a; 1.发送命令&#xff1a;客户端将要执行的命令发送到Redis服务器。 2.命令排队&#…