Shortcuts 功能跟随着 Android7.1 Nougat 一起诞生,其主要目在于用户可以定义一些常用的操作路径,以快捷方式的形式存在,这些快捷方式展示在可以支持的设备上,帮助用户快速启动常用或者推荐的页面和行为。
最近也是有 Shortcut 相关的需求需要开发,特此进行了总结,希望可以帮助到大家。
##概览
快捷方式一般是以两种方式存在:
一种通过** 长按 **应用 icon,此时会弹出列表弹窗,里面展示需要操作的路径,对于没有配置快捷方式的应用,一般只会展示分享或者应用信息的入口(不同手机可能展示不一样)。如果该应用配置了快捷方式,那么在列表中则会展示对应的快捷方式入口。
如上图所示,配置和没有配置快捷方式的区别就在于,列表中是否配置自定义的快捷方式入口。
另一种则以桌面快捷方式的形式存在,同一种行为可以存在多个相同的桌面快捷方式。
如上图,对于** Chrome-打开新的标签页** 这种行为可以有多个相同的桌面快捷方式。
Shortcuts 类型
每个快捷方式都可以携带一个或多个 intent,当用户点击快捷方式时,每个 intent 都会触发应用中对应的操作,一般快捷方式的创建类型取决于你具体快捷方式存在的形态和你想赋予他什么样的行为。可以以下面的例子作为参考:
- 在天气应用中,想查看最近几天天气的趋势
- 在电子邮件应用中,想创建新的电子邮件
- 在地图应用中,定位一个具体的位置
- 在聊天应用中,向指定好友发送信息
- 在媒体应用中,播放电视节目的下一集
- 在游戏应用中,加载游戏最后一个保存的时间点
你可以为你的应用发布以下类型的快捷方式
- 静态的快捷方式: 其直接会打包到 apk 或 apk bundle 中,安装完应用便存在快捷方式入口。
- 动态的快捷方式: 只有在应用运行时才会创建,可以随时的更新、添加和删除对应的快捷方式。
- 桌面快捷方式: 必须在用户授权的情况下,可以主动的添加快捷方式到桌面,同样可以拷贝动态和静态的快捷方式到桌面。
Shortcuts 限制条件
虽然对于一个应用程序一般可以创建五个快捷方式,其中包括静态和动态的,但是但多数的设备上只能展示** 四个**。
但是桌面快捷方式是不做限制的,不过桌面快捷方式非用户主动删除的话,是没法移除的,只能通过禁用的方式让该桌面快捷方式失效。
##使用
快捷方式可以帮助用户快速访问常用的路径和页面,从而为用户提供特定类型的内容。
Shortcuts 类型选择
那该如何选择快捷方式类型,这取决你的快捷方式是应用驱动还是用户驱动。虽然静态快捷方式意图不可更改,动态的可更改,但是这两种都是属于应用驱动。如果用户想自定义想要的意图,通过桌面快捷方式形式的展现,那这就是用户驱动。
怎么理解呢?用简书作为例子进行讲解:
静态快捷方式: 这种最适合那种在整个程序的生命周期中,意图不会改变,始完成整同一种行为。鉴于程序一般只能显示四个快捷方式,那静态的快捷方式一般对于那种比较常见的行为非常有用和有必要。
例如上图简书中,像「搜索」入口就比较常见,不需要传递参数或传递的参数不会改变,那这种就建议使用静态快捷方式。
动态快捷方式: 这种一般对意图较为敏感的操作。意图可能在应用运行中发生改变,需要更新快捷方式。
例如简书入口中的 「我的公开文章」,因为多账号的原因,可能切换账号,那跳转的页面所携带的参数就会改变,快捷方式就需要更新,这种就需要使用静态快捷方式。
桌面快捷方式: 这种允许用户自定义跳转意图。
例如简书支持将关注的人创建快捷方式到桌面,下次直接可以访问该人的动态信息,这种完全是用户自发的创建,所以使用桌面快捷方式。
Shortcuts 类型创建
有了上述类型的具体描述,下面针对这三种快捷方式的创建进行例子介绍。
创建静态快捷方式
静态快捷方式提供应用程序内的通用跳转,这些一般在整个程序的生命周期内是保持不变的。
通过以下步骤完成静态快捷方式的创建:
-
在 AndroidManifest.xml 中找到配置 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 的 Activity。
-
添加 元素到 Activity 中
创建新的资源文件:res/xml/shortcuts.xml
<?xml version="1.0" encoding="utf-8"?>具体参数配置说明如下:
如果有数据的传递,要有对应的解析
if (getIntent().getData() != null && TextUtils.equals(getIntent().getAction(), Intent.ACTION_VIEW)) {
Uri uri = getIntent().getData();
List pathSegments = uri.getPathSegments();
if (pathSegments != null && pathSegments.size() > 0) {
tvTest.setText(pathSegments.get(0));
}
}
最终的运行效果:
创建动态快捷方式
动态快捷方式提供向指向应用内特定的跳转或数据传递,这些跳转和数据可能会在应用执行中发生变化。
此时需要借助 ShortcutManager 提供的 API 来完成动态快捷方式的相应操作:
- 创建: 使用 setDynamicShortcuts() 重新定义动态快捷方式的完整列表
- 添加: 使用 addDynamicShortcut() 来扩充现有的动态快捷方式列表
- **更新: **使用 updateShortcuts() 方法进行更新现有的动态快捷方式列表
- 删除: 使用 removeDynamicShortcuts() 移除一组动态快捷方式,或者使用 removeAllDynamicShortcuts() 移除所有动态快捷方式
以创建为例,其他差不多,自行尝试,具体的操作可参考下面的代码:
1. 创建 ShortcutInfo 对象
@TargetApi(Build.VERSION_CODES.N_MR1)
private ShortcutInfo createShortcutInfo1() {
return new ShortcutInfo.Builder(this, ID_DYNAMIC_1)
.setShortLabel(getString(R.string.dynamic_shortcut_short_label1))
.setLongLabel(getString(R.string.dynamic_shortcut_long_label1))
.setIcon(Icon.createWithResource(this, R.drawable.add))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(“http://xiaweizi.cn/”)))
.build();
}
2. 调用 setDynamicShortcuts() 覆盖掉之前的,重新设置新的动态快捷方式列表
private void setDynamicShortcuts() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
List shortcutInfo = new ArrayList<>();
shortcutInfo.add(createShortcutInfo1());
shortcutInfo.add(createShortcutInfo2());
if (shortcutManager != null) {
shortcutManager.setDynamicShortcuts(shortcutInfo);
}
}
}
3. 可以配置 label 的字体颜色
@TargetApi(Build.VERSION_CODES.N_MR1)
private ShortcutInfo createShortcutInfo2() {
Intent intent = new Intent(this, TestActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(“key”, “fromDynamicShortcut”);
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.BLUE);
String label = getResources().getString(R.string.dynamic_shortcut_short_label2);
SpannableStringBuilder colouredLabel = new SpannableStringBuilder(label);
colouredLabel.setSpan(colorSpan, 0, label.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
return new ShortcutInfo.Builder(this, ID_DYNAMIC_2)
.setShortLabel(colouredLabel)
.setLongLabel(getString(R.string.dynamic_shortcut_long_label2))
.setIcon(Icon.createWithResource(this, R.drawable.link))
.setIntent(intent)
.build();
}
最终的运行效果:
创建桌面快捷方式
在 Android 8.0(API26)或者更高的版本上,可以创建桌面快捷方式。与静态和动态快捷方式不同,桌面快捷方式支持在设备上单独的 icon 展示。
如果想创建桌面快捷方式,按照以下步骤进行完成:
1. 使用 isRequestPinShortcutSupported() 来验证设备是否支持应用创建桌面快捷方式
2. 根据快捷方式是否已经存在,用下面两种方式之一来创建 ShortcutInfo 对象:
3. 如果快捷方式已经存在,请创建仅包含现有快捷方式 id 的 ShortcutInfo 对象,系统自动查找并带上与快捷方式有关的所有相关数据
**4.**如果要固定新的快捷方式,请创建一个 ShortcutInfo 对象,其中包含新的快捷方式 id、意图和短标签
5. 尝试通过调用 requestPinShortcut() 将快捷方式固定到设备桌面上,在此过程中,可以传入 pendingIntent 对象,该对象仅在快捷方式成功固定时告知应用。
具体的代码可参考下面:
private void createPinnedShortcuts() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
if (shortcutManager != null && shortcutManager.isRequestPinShortcutSupported()) {
Intent intent = new Intent(this, TestActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(“key”, “fromPinnedShortcut”);
ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(this, “my-shortcut”)
.setShortLabel(getString(R.string.pinned_shortcut_short_label2))
.setLongLabel(getString(R.string.pinned_shortcut_long_label2))
.setIcon(Icon.createWithResource(this, R.drawable.add))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
boolean b = shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender());
Utils.showToast(this, "set pinned shortcuts " + (b ? “success” : “failed”) + “!”);
}
}
}
最终运行效果:
好了,基础简单的使用就介绍到这了,相信对 Shortcuts 的使用场景和具体实现都有一定的了解了,接下来开始介绍进阶的使用。
##Shortcuts进阶使用
快捷方式创建完成后,可能还需要对其进行管理,比如动态更新或者禁用某些快捷方式,此时就需要了解一些进阶的使用了。
移除 Shortcut
对于 静态快捷方式 而言,其在一开始就打包到了 apk 或者 apk bundle 中,是不允许对其进行更改的,除非发布新的版本覆盖掉之前的快捷方式,不然会一直存在。
对于 动态快捷方式 ,既然可以在代码中进行创建,同样也可以在代码中进行移除,这个之前也介绍过。
而对于 桌面快捷方式,它直接展示在桌面上,始终可见,仅在以下情况才能删除桌面快捷方式。
- 用户主动移除
- 卸载与快捷方式的应用
- 用户在应用信息中,清除全部的缓存数据
Shortcut 展示顺序
对于一个应用上所有的快捷方式,展示的规则按照以下顺序:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-oDi5i60B-1712694420883)]
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
[外链图片转存中…(img-FeJJmFm1-1712694420884)]
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!