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