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静态,需要考虑是否有必要,如果非必要可采取动态创建。

猜你喜欢

转载自blog.csdn.net/qq36246172/article/details/130945332