ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android-Shortcuts,让你在系统桌面上为所欲为,2021年最新腾讯Android面经

2022-03-19 21:31:30  阅读:214  来源: 互联网

标签:桌面 Shortcuts 创建 面经 ShortcutInfo intent Android 动态 快捷方式


虽然对于一个应用程序一般可以创建五个快捷方式,其中包括静态和动态的,但是但多数的设备上只能展示** 四个**。

但是桌面快捷方式是不做限制的,不过桌面快捷方式非用户主动删除的话,是没法移除的,只能通过禁用的方式让该桌面快捷方式失效。

##使用

快捷方式可以帮助用户快速访问常用的路径和页面,从而为用户提供特定类型的内容。

Shortcuts 类型选择

那该如何选择快捷方式类型,这取决你的快捷方式是应用驱动还是用户驱动。虽然静态快捷方式意图不可更改,动态的可更改,但是这两种都是属于应用驱动。如果用户想自定义想要的意图,通过桌面快捷方式形式的展现,那这就是用户驱动。

怎么理解呢?用简书作为例子进行讲解:

静态快捷方式: 这种最适合那种在整个程序的生命周期中,意图不会改变,始完成整同一种行为。鉴于程序一般只能显示四个快捷方式,那静态的快捷方式一般对于那种比较常见的行为非常有用和有必要。

例如上图简书中,像「搜索」入口就比较常见,不需要传递参数或传递的参数不会改变,那这种就建议使用静态快捷方式。

动态快捷方式: 这种一般对意图较为敏感的操作。意图可能在应用运行中发生改变,需要更新快捷方式。

例如简书入口中的 「我的公开文章」,因为多账号的原因,可能切换账号,那跳转的页面所携带的参数就会改变,快捷方式就需要更新,这种就需要使用静态快捷方式。

桌面快捷方式: 这种允许用户自定义跳转意图。

例如简书支持将关注的人创建快捷方式到桌面,下次直接可以访问该人的动态信息,这种完全是用户自发的创建,所以使用桌面快捷方式。

Shortcuts 类型创建

有了上述类型的具体描述,下面针对这三种快捷方式的创建进行例子介绍。

创建静态快捷方式

静态快捷方式提供应用程序内的通用跳转,这些一般在整个程序的生命周期内是保持不变的。

通过以下步骤完成静态快捷方式的创建:

  1. 在 AndroidManifest.xml 中找到配置 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 的 Activity。

  2. 添加  元素到 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_DYNA

MIC_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 展示顺序

对于一个应用上所有的快捷方式,展示的规则按照以下顺序:

  1. 静态快捷方式: isDeclaredInManifest() 放回 true 的快捷方式
  2. 动态快捷方式:ShortcutInfo.isDynamic() 返回 true 的快捷方式

在每种快捷方式中,又会按照 ShortcutInfo.getRank() 按等级递增的顺序排序。等级是非负的,连续的整数, 调用 updateShortcuts(List),addDynamicShortcuts(List) 或 setDynamicShortcuts(List) 时,可以更新现有快捷方式的等级。

排名是自动调整的,因此它们对于每种类型的快捷方式都是唯一的。 例如,有三个 rank 分别为 0、1和2 的动态快捷方式,此时再添加一个 rank 为 1 的动态快捷方式放在第二的位置上,那最后两个就会被顺延一个位置,rank 变成 2和3。

Shortcut intents 配置

如果希望应用在用户激活快捷方式时执行多项操作,则可以将其配置为触发后多项活动。你可以通过分配多个 intent,启动一个 activity 到另一个 activity,具体的要取决你快捷方式的类型。

使用 ShortcutInfo.Builder 创建快捷方式时,可以使用 setIntents() 而不是 setIntent()。通过调用 setIntents() 你可以在用户点击快捷方式时触发多个 activity,将除列表中最后一个 activity 之外的所有 activity 放在后续堆栈中。如果此时点击返回按钮,会按照之前存储的堆栈 activity 顺序进行展示,而不是直接回到首页。

比如按照下面代码配置多个 intent:

@TargetApi(Build.VERSION_CODES.N_MR1)
private ShortcutInfo createShortcutInfo1() {

最后

感谢您的阅读,在文末给大家准备一个福利。本人从事Android开发已经有十余年,算是一名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

所以在此将我十年载,从萌新小白一步步成长为Android移动开发架构师的学习笔记,从Android四大组件到手写实现一个架构设计,我都有一一的对应笔记为你讲解。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。
历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-N0l0Go1y-1647696228814)]

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

标签:桌面,Shortcuts,创建,面经,ShortcutInfo,intent,Android,动态,快捷方式
来源: https://blog.csdn.net/m0_67740402/article/details/123603184

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有