Android 7.1 App Shortcuts使用

Android 7.1已经发了预览版, 这里是API Overview: API overview.
其中App Shortcuts是新提供的一种快捷访问方式, 形式为长按应用图标出现的长条.

图来自: Exploring Android Nougat 7.1 App Shortcuts

点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置.

App Shortcuts 是什么

其中App Shortcuts是指在桌面长按app图标而出现的快捷方式, 可以为你的app的关键功能添加更快速的入口而不用先打开app.

点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置, 变成单独的桌面快捷方式(pinned shortcuts).

有两种shortcuts:

  • 静态的: 在xml中定义, 适用于一些通用的动作.
  • 动态的: 由ShortcutManager发布, 可以根据用户的行为或者偏好添加, 可以动态更新.

每一个应用目前最多可以有5个shortcuts(静态 + 动态).

运行条件:
应用添加App Shortcuts是Android 7.1(API 25)的API, 所以只能在Android 7.1的设备上显示, 同时需要launcher支持, 比如Pixel launcher(Pixel设备的默认launcher), Now launcher(Nexus设备上的launcher)现在就支持, 其他launcher也可以提供支持.

静态Shortcuts使用

静态的Shortcuts是写在xml中的, 直到下一次应用升级, 不能被改变.
要添加静态shortcuts只需两步:
首先, 在应用的Manifest中启动Activity上添加<meta-data>:

    <activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="android.app.shortcuts"android:resource="@xml/shortcuts" /></activity>

然后在res/xml/目录下创建shortcuts.xml文件, 里面包含静态的shortcuts:

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid:enabled="true"android:icon="@drawable/ic_check_circle_black_24dp"android:shortcutDisabledMessage="@string/static_shortcut_disabled_message"android:shortcutId="static"android:shortcutLongLabel="@string/static_shortcut_long_label_1"android:shortcutShortLabel="@string/static_shortcut_short_label_1"><intentandroid:action="android.intent.action.VIEW"android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"android:targetPackage="com.ddmeng.hellonougat" /></shortcut><shortcutandroid:enabled="true"android:icon="@drawable/ic_android_black_24dp"android:shortcutDisabledMessage="@string/static_shortcut_disabled_message"android:shortcutId="static_2"android:shortcutLongLabel="@string/static_shortcut_long_label_2"android:shortcutShortLabel="@string/static_shortcut_short_label_2"><intentandroid:action="android.intent.action.MAIN"android:targetClass="com.ddmeng.hellonougat.MainActivity"android:targetPackage="com.ddmeng.hellonougat" /><intentandroid:action="com.ddmeng.hellonougat.action.STATIC_SHORTCUT_2"android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"android:targetPackage="com.ddmeng.hellonougat" /></shortcut>
</shortcuts>

这就好了, 这个文件添加了两个shortcuts, 点击都将打开指定的Activity, 本例子中是StaticShortcutActivity.

用多个Intent构建back stack

上面这个文件里添加了两个静态的shortcuts, 第一个关联了一个Activity, 点击shortcut将直接打开这个Activity, 回退的时候回到桌面.

如果你想要的效果是点击back键回到应用里的某个界面, 那么可以利用多个intents来构建back stack, 比如在第二个shortcut里面, 点击shortcut还是打开目标Activity, 这个指定目标Activity的Intent放在最后, 但是回退会返回到MainActivity, 即之前的那个Intent.

动态Shortcuts使用

动态的shortcuts可以在用户使用app的过程中构建, 更新, 或者删除.
使用ShortcutManager可以对动态shortcuts完成下面几种操作:

  • Publish发布: setDynamicShortcuts(), addDynamicShortcuts(List);
  • Update更新: updateShortcuts(List);
  • Remove删除: removeDynamicShortcuts(List), removeAllDynamicShortcuts().

比如添加一个动态shortcut:

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1").setShortLabel("Web site").setLongLabel("Open the web site").setIcon(Icon.createWithResource(context, R.drawable.icon_website)).setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse("https://www.mysite.example.com/"))).build();shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));

点击这个shortcut会发出一个打开网页的Intent, 让你选择浏览器, 从而打开网址.

多个Intent构建back stack

动态的shortcut仍然可以用多个Intent来指定一个back stack, 那么打开目标Activity之后就可以返回到应用中的指定界面而不是回到launcher:

ShortcutInfo dynamicShortcut2 = new ShortcutInfo.Builder(this, "shortcut_dynamic").setShortLabel("Dynamic Shortcut").setLongLabel("Open Dynamic shortcut 2").setIcon(Icon.createWithResource(this, R.drawable.ic_favorite_border_black_24dp)).setIntents(// this dynamic shortcut set up a back stack using Intents, when pressing back, will go to MainActivity// the last Intent is what the shortcut really openednew Intent[]{new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),new Intent(DynamicShortcutActivity.ACTION_OPEN_DYNAMIC)// intent's action must be set}).build();

和静态一样, 最后一个Intent对应的是shortcut打开的界面DynamicShortcutActivity, 前面的都是用来构建back stack, 即back退回到MainActivity.
注意这里的Intent必须指定Action, 否则会抛出异常.

Shortcuts的个数限制

Shortcuts的总数不能超过5个, 即静态和动态shortcuts加起来总数最多是五个.
当我们尝试添加第六个shortcut时, 应用会抛出异常: java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded.

虽然总数限制是5个, 但是当我正好有5个(2个静态 + 3个动态)的时候, 长按只显示了4个shortcuts.
如图:

本文完整代码见: Demo地址: HelloNougat.

Shortcuts的次序

当我们有多个Shortcuts之后, 默认它们是按照添加顺序排列的, 即按照添加顺序rank递增.

可以通过setRank()来改变长按时它们显示的排序:

@TargetApi(25)
private void updateDynamicShortcuts() {ShortcutInfo webShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_blog").setRank(1).build();ShortcutInfo dynamicShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_dynamic").setRank(0).build();// the rank value can not be set to negative, otherwise will throw// java.lang.IllegalArgumentException: Rank cannot be negative or bigger than MAX_RANK// the static shortcuts have the rank 0, so they will always be closest to launcher iconshortcutManager.updateShortcuts(Arrays.asList(webShortcut, dynamicShortcut));
}

这样更改之后, 原先排在最远端的shortcut_dynamic被移到了第三个, shortcut_blog被移到了它的后面.

setRank()不接受负值, 会抛出异常.

我们只能改变动态shortcuts的排序, 静态的shortcuts等级为0, 它们是按照xml中写定的先后顺序排的, 所以:
静态的shortcuts永远离应用icon最近, 动态shortcuts在其之上排序, rank越大的离应用icon越远.
如果没有指定rank, 则按生成的顺序递增.

参考

App Shortcuts的官方文档: App Shortcuts
Exploring Android Nougat 7.1 App Shortcuts

Demo地址: HelloNougat.
近期考虑加入更多Android 7 Nougat特性sample.

最后, 欢迎关注微信公众号: 圣骑士Wind

Android 7.1 App Shortcuts使用相关推荐

  1. android 7.1快捷方式App Shortcuts

    App Shortcuts 功能描述 仅支持Android 7.1 (API level 25)及以上版本 Shortcut静态和动态的总和不能超过5个,但目前仅支持4个 一.静态注册: 1.创建re ...

  2. Android App Shortcuts

    周五了,周末还远吗?~ 加入我知识星球的人都得到了提升,可不要错过哦~ 点击阅读原文即可. 本文较长,阅读大约十分钟 ~ 我们都知道iPhone6S推出了3D Touch的功能,也算是一个大卖点,Go ...

  3. Android 长按APP图标弹出快捷方式(shortcuts)

    今天给大家分享一份关于Android 7.1版本的一个新特性 Shortcut 它是谷歌在Api Level 25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按 某些APP ...

  4. App Shortcuts

    编辑于2018年9月7日 如果您的应用定位到Android 7.1(API级别25)或更高版本,则可以为应用中的特定操作定义快捷方式. 这些快捷方式可以显示在支持的启动器中. 快捷方式可让您的用户快速 ...

  5. Android如何更新app的版本(中级)

    Android如何更新app的版本(中级) 版本更新 看看我们要用到哪些技术1 自定义通知栏 2 HTTP 下载 3 AsyncTask 4 刷新通知栏中的进度条 5 执行 apk安装的隐士意图 6 ...

  6. 【Android】 01. APP 进程启动和 ActivityThread 的关系

    2019独角兽企业重金招聘Python工程师标准>>> 首先我们应该知道2个概念: 我们应该知道在Android中一个app就是一个进程: 我们在普通的Java程序中一个程序的入口是 ...

  7. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  8. Program type already present: android.support.v4.app.BackStackRecord$Op

    Program type already present: android.support.v4.app.BackStackRecord$Op 原文:https://blog.csdn.net/zww ...

  9. android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统

    计算机毕设项目之基于Android系统的App点餐外送系统 一. 项目名称 基于Android系统的App点餐外送系统 二. 项目简介 本项目是基于Android系统的手机点餐系统,整个项目分为App ...

最新文章

  1. tcpdf html 格式重叠,html - tcpdf(html2pdf)无法正确生成表格边框 - 堆栈内存溢出...
  2. storyboard和xib的区别
  3. [asp.net] 获取网页访问来路的几种方法
  4. vaadin_Vaadin Flow –奇妙的鹿
  5. 周鸿祎回顾IPO一周年:保持创业心态 看好无线
  6. [笔记][原创]Verilog HDL语法分析笔记
  7. java输入最大10位数,倒数输出(很鸡肋)
  8. 一款纯HTML二次元响应式引导页
  9. 汉字笔顺动画技术剖析,android应用开发实战
  10. AmazeUI 离线文档
  11. GZHU - 1523 疯狂钻石 (完全背包)
  12. 服务器信号标识是什么意思,手机信号栏的这些“符号”是什么意思,你知道吗?...
  13. MySQL 百分比排序
  14. 王道考研计算机网络第三章--数据链路层
  15. iOS杂谈15—APP被苹果APPStore拒绝的各种原因
  16. 整理了100个软硬件都要懂的示波器基础知识
  17. 《论语》原文及其全文翻译 学而篇1
  18. 【专家观点】超大规模数据要素市场体系下数据价格生成机制研究
  19. SpringSecurity:登录
  20. matlab 图像分割库,图像分割Matlab代码

热门文章

  1. 【PostgreSQL-9.6.3】约束
  2. 解决误删/bin/bash问题
  3. centos 解决“不在 sudoers 文件中。此事将被报告“的问题
  4. 关于腾讯云redis 无法外网访问的解决方案
  5. 前台ajax请求php后台返回成功却进error方法解决
  6. 如何从javascript检索GET参数? [重复]
  7. 在Java中安全地将long转换为int
  8. Normalize.css和Reset CSS有什么区别?
  9. activiti处理当前用户的任务
  10. 海信CAS计算机辅助手术系统,计算机辅助手术系统(CAS)