Android 7.1 新特性:App Shortcuts 简介

Android 7.1 新功能之一就是 App Shortcuts(应用快捷方式) ,该功能与 iPhone 上的 3D Touch 功能相似,通过长按应用图标,可弹出应用快捷方式,点击可以直接跳转到相应的界面。目前最多支持 5 个快捷方式,可以 getMaxShortcutCountPerActivity() 查看 Launcher 最多支持几个快捷方式,不同的是 Android 支持通过拖拽将快捷方式固定到桌面。

看似美好,其实应用快捷方式还是有很多缺陷的:

  1. 只能在 Google 的 Nexus 及 Pixel 设备上使用
  2. 系统必须是 Android 7.1 及以上(API Level >= 25)
  3. 已经被用户固定到桌面的快捷方式必须得到兼容性处理,因为你基本上失去了对其控制,除了升级时禁用
    Launcher applications allow users to “pin” shortcuts so they’re easier to access. Both manifest and dynamic shortcuts can be pinned. Pinned shortcuts cannot be removed by publisher applications; they’re removed only when the user removes them, when the publisher application is uninstalled, or when the user performs the “clear data” action on the publisher application from the device’s Settings application.
    However, the publisher application can disable pinned shortcuts so they cannot be started. See the following sections for details.

应用快捷方式可分为 Static Shortcuts(静态快捷方式)Dynamic Shortcuts(动态快捷方式) 两种。

  • 静态快捷方式:又名 Manifest Shortcuts,在应用安装时创建,不能实现动态修改,只能通过应用更新相应的 XML 资源文件才能实现更新。
  • 动态快捷方式:应用运行时通过 ShortcutManager 实现动态添加、删除、禁用等操作。

下面分别来讲述如何创建静态快捷方式和动态快捷方式。

创建静态快捷方式

  1. 在 /res/xml 目录下创建 shortcuts.xml ,添加根元素 <shortcuts> ,其包含一组 <shortcut> 标签。每个 <shortcut> 标签为一个静态快捷方式,它包含相应的图标、描述以及对应的 intent
  2. 打开 AndroidManifest.xml 文件,找到其中 <intent-filter> 被设置为 android.intent.action.MAINandroid.intent.category.LAUNCHER 的 Activity
  3. 给这个 Activity 添加 <meta-data> ,引用资源 shortcuts.xml

补充:注意第 2 点的描述,也就是说如果 Manifest 中存在多个满足条件的 Activity ,那么就可以存在多组应用快捷方式,但资源文件必须不同,主要是 shortcutId 必须不同,否则不会显示。大家可以自己去尝试下~

标签属性含义如下:

gradle 配置

屏幕快照 2016-11-01 上午8.46.31

关于 compileSdkVersion 、 minSdkVersion 以及 targetSdkVersion 的区别可参考这篇文章

创建动态快捷方式

创建动态快捷方式主要依靠 ShortManagerShortcutInfoShortcutInfo.Builder 这几个类来实现。ShortcutInfo 和 ShortcutInfo.Builder 主要用来构造快捷方式对象, ShortManager 是一个系统服务,用于管理应用快捷方式,ShortManager 可以通过以下方式获取:

ShortManager 主要有以下几个功能:

  • 发布:通过调用 setDynamicShortcuts(List) 替换整个快捷方式列表或者通过 addDynamicShortcuts(List) 往已存在的快捷方式列表中添加快捷方式。
  • 更新:调用 updateShortcuts(List) 来更新已存在的快捷方式列表
  • 移除:调用 removeDynamicShortcuts(List) 移除列表中指定快捷方式,调用 removeAllDynamicShortcuts() 移除列表中所以快捷方式。
  • 禁用:因为用户可能将您任意的快捷方式拖拽到桌面,而这些快捷方式会将用户引导至应用中不存在或过期的操作,所以可以通过调用 disableShortcuts(List) 来禁用任何已存在的快捷方式。调用 disableShortcuts(List, Charsquence) 会给出错误提示。

下面代码主要演示了使用 ShortManager 实现动态发布、更新、移除以及禁用快捷方式。

动态创建快捷方式核心代码:

代码基本涵盖了动态创建快捷方式的所有情况,组合测试一下就可以了。

注意代码中的 addDynamicShortcuts() 方法,该方法调用 getAlarmShortcut(String shortcutLabel) 方法生成 ShortcutInfo ,该方法生成的 ShortcutInfo 的 id 是在变化的,如果多次点击超过 mShortcutManager.getMaxShortcutCountPerActivity() 的值,就会抛出如下异常:

所以在动态添加快捷方式之前最好先检查一下是否超过最大值。

还有,disableDynamicShortcuts() 注释了使用 ShortManager 动态修改静态快捷方式的代码,因为静态快捷方式时不允许在运行时进行修改的,如果执行了修改会抛出如下异常:

值得注意的地方

前面讲了创建静态快捷方式和动态快捷方式,可能某些要点还没讲到,这里做下总结。

被禁用的快捷方式还计入已经创建快捷方式里嘛

addDynamicShortcuts()disableDynamicShortcutsprintDynamicShortcuts() 测试,发现被禁用的快捷方式时不算已经创建的快捷方式的。

总结

简单的总结了一下 Android 7.1 中应用快捷方式的创建及注意点,但某些不太常用的没怎么去研究,有兴趣的可以参考 Android 官方文档

参考:

  1. ShortcutManager
  2. App Shortcuts

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 收藏 评论

关于作者:踏歌行

希望有一天我能够很坦然地说:\"让我来告诉你,在我眼中,这是一个怎样的世界。\" 个人主页 · 我的文章 · 24 ·   

可能感兴趣的话题



直接登录
跳到底部
返回顶部