Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch。通过在桌面长按 App 弹出 Shortcut 列表,点击某个 Shortcut 快速进入某项操作,同时 Shortcut 可以拖动到桌面进行固定,如下图系统日历 App:
由于 7.1 SDK 的 Sources 尚未开放,目前大部分内容还是根据官方 API 文档而来,还有些细节和可能的 Bug 还得等 Sources 开放。
Shortcuts 全面介绍分为两篇,本文是基础介绍,关于 Shortcuts 一些不错的实践和目前的问题可访问 trinea.cn 最新文章。
类似 BroadcastReceiver 可通过静态和动态方式注册,Shortcuts 也可以通过静态和动态方式添加。
meta-data name 为 android.app.shortcuts,如下:
必须在 Main Launcher 对应的 Activity 内设置,其中 android:resource 指向定义了 shortcuts 的资源文件。
res 目录下新建 xml 文件夹,并新建 shortcuts.xml 文件,内容如下:
以 shortcuts 元素为根,可以包含多个 shortcut 元素,每个 shortcut 元素表示一个 shortcut。其中属性分别表示:
(1) shortcutId 表示 shortcut 唯一标识符,相同的 shortcutId 会被覆盖。必须字段。
(2) shortcutShortLabel 为将 shortcut 拖动到桌面时显示的名字,官方建议不超过 10 个字符,必须字段。
(3) shortcutLongLabel 为 shortcut 列表中每个 shortcut 的名字,不宜过长,如果过长或未设置默认会显示 ShortLabel,官方建议不超过 25 个字符。可选字段。
(4) icon 为 shortcut 的 icon,在列表展示和拖动到桌面时显示需要,可选字段。
(5) enabled 表示 shortcut 是否可用,false 表示禁用。xml 中这个属性几乎没有被设置为 false 的实际场景,具体原因可见 6.7 如何更好的删除(废弃)老的 Shortcut中介绍。
(6) shortcutDisabledMessage 为已固定在桌面的 shortcut 被 Disabled 后点击时的 Toast 提示内容。可选字段。
(7) intent 为点击 shortcut 时响应的 intent,必须字段。
这里可以添加多个 intent,但点击时不会启动所有 intent,而是启动最后一个 intent,在这个 intent 回退时会启动它前面一个 intent,相当于自动将所有 intent 添加到了堆栈。
intent 可设置属性包括:
android:action、android:data、android:mimeType、android:targetClass、android:targetPackage,其中 android:action 为必须属性。
动态 ShortcutsDynamic Shortcuts 通过 ShortcutManager API 进行操作。可以动态添加、修改、删除。
通过 ShortcutInfo.Builder 新建 ShortcutInfo,再通过 shortcutManager 添加即可。其他:
(1) setDynamicShortcuts(List) 可以替换并添加所有 shortcut 列表;
(2) addDynamicShortcuts(List) 可以添加新的 shortcut 到列表,超过最大个数会报异常;
(3) updateShortcuts(List) 可以更新一组 shortcuts;
(4) removeDynamicShortcuts(List) 和 removeAllDynamicShortcuts() 可以删除部分或所有 shortcuts。
ShortcutInfo 的属性与 xml 中定义字段含义一致,shortcutId shortcutShortLabel intent 是必须设置的字段,并且 intent 必须设置 Action。
指通过拖动固定到桌面的 Shortcuts,App 不可以添加、修改、删除这些 Shortcuts,只能禁用他们。即便 App 内删除了某个 Shorcut,对应的已固定到桌面的 Shortcuts 也不会被删除。
可以通过:
(1) getPinnedShortcuts() 得到所有固定的 Shortcuts 的信息。
(2) disableShortcuts(List) 或 disableShortcuts(List, CharSequence) 禁用动态的 Shortcuts。
对于静态的 Shortcuts 需要在资源文件中设置 android:enabled="false" 进行禁用,不过没有必要,静态 Shortcuts 可直接通过删除达到禁用的效果,具体原因可见 6.7 如何更好的删除(废弃)老的 Shortcut 中介绍。
静态 Shortcuts 和动态 Shortcuts 是有最大个数限制的,默认为 5,超过最大个数后添加会报异常。而固定的 Shortcuts 并没有个数限制,并且固定的 Shortcut 对应的 Shortcut 即便被动态删除了,依然可以通过 id 进行 Update 操作。
5.1 动态 Shortcuts 与静态 Shortcuts 区别
(1) 静态 Shortcuts 只能通过升级应用修改,动态 Shortcuts 随时可以修改;
(2) 静态 Shortcuts 的 Intent 无法设置 Flag,默认为 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK Flag,即若应用运行中会清除所有已存在的 Activity。动态 Shortcuts 的 Intent 可以设置 Flag;
(3) 静态 Shortcuts 的 rank 系统默认根据声明顺序设置,动态 Shortcuts 的 rank 可以通过 setRank(int rank) 接口主动设置,rank 不能小于 0,值越大表示在 shortcut 列表展示时离 App Icon 越远。静态 Shortcuts 默认比动态 Shortcuts 离 App Icon 更近。
(4) 静态 Shortcuts 删除可以直接删除,动态 Shortcuts 建议通过禁用删除;
5.2 动态 Shortcuts 操作的频率问题
当应该完全退到后台(无 Activity 或 Service 在前台时),其操作 Shortcut(包括添加、删除、修改) 的频率是受限的。可通过 isRateLimitingActive() 查询是否已受限,true 表示已受限。
5.3 跟踪 Shorcut 使用情况
在 Shortcut 被选择或者其关联的操作被操作时需调用 reportShortcutUsed(String shortcutId) 接口上报数据,为了方便启动器收集应用 Shortcuts 使用情况,可能未来进行预测或者向开发者展示哪些操作适合作为 Shortcuts 以及其优先级。
PS:这个接口其实挺尴尬的,一方面需要 App 主动上报,侵入性太强。另一方面这个预测功能未来也不好加到 Shortcuts 推荐里,更多是个开发工具相关功能。
最好是由启动器自己纯粹收集 Shortcut 被选择的使用情况数据,而不需要统计 Shortcut 被关联操作通过其他方式调用的使用情况数据。至于哪些操作适合作为 Shortcuts,开发者大可通过其他监控 SDK 去判断。
更多关于 Shortcuts 比较好的实践、使用过程中可能的问题、Launcher 如何支持可见:
http://www.trinea.cn/android/new-features/android-7-1-shortcuts-best-pratices/
或直接点击文末的 阅读原文。
-----------福利分割线-----------
一直以来 Android 技术沙龙主要集中在北京,这次南方的小伙伴有机会了。
本周六由 Diycode 社区寂小桦、微信 Android 工程师张绍文、欢聚时代葱花、酷狗杨亚斌等发起的 Android 技术沙龙在广州市举行,议题如下:
沙龙门票为 100 元,主办方赠了我 1 张免费票和 10 张八折优惠券,通过公众号送给大家。老规矩:
免费票:大家可评论留下你想获得免费票的理由,截止明晚 22 点,赠予获得点赞最多的一位朋友。
八折票:评论或后台私信即可,先到先得。