Hello Shortcuts

从Android7.1(API level25)开始,开发者可以为自己的app定制shortcuts。shortcuts使用户更便捷、快速的使用app。我个人感觉有点像ios的压力感应,但是我认为Google的shortcuts动画做的更好看:)。

shortcuts分为两种:

  1. Static shortcuts:静态shortcuts是在资源文件中定义的,所以你只能通过升级你的app来更新静态shortcuts的相关信息。

  2. Dynamic shortcuts:动态shortcuts是通过ShortcutManager相关的API来实现运行时新增、修改、移除shortcuts的。

另外关于shortcuts有以下几点小tips:

  1. 最多可以设置5个快捷方式,(但经测试最多只能显示4个)。有些启动器(launcher app)不会显示出你添加的所有的快捷方式。

  2. 用户可以长按shortcuts将其固定到桌面,Google称其为“pinned shortcuts”,pinned shortcuts的数量是没有限制的,并且开发者无权移除这些pinned shorcuts(只能用户自己移除或者删除app后自动移除,如果某个shortcuts已经被固定到桌面,即使动态删除了该shortcuts,桌面的shortcuts也不会消失且可以正常使用),但可以将其设为不可用状态(disbale)。

  3. 虽然其他app无法通过shortcuts访问你的app的元数据(metadata),但启动器(laucher)可以,所以在使用shortcuts时要注意保护用户的隐私信息。

静态shortcuts(Static Shortcuts)的使用

  1. 清单文件Manifest中在启动页添加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-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
  1. res文件夹内新建文件夹xml,新建文件shortcuts.xml

    //shortcuts.xml
    
    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
    android:shortcutId="shortCutId1"
    android:enabled="true"
    android:icon="@drawable/icon_android"
    android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    android:shortcutLongLabel="@string/compose_shortcut_long_label1"
    android:shortcutDisabledMessage="@string/compose_disabled_message1">
    <intent
    android:action="android.intent.action.VIEW"
    android:targetPackage="com.example.zengyazhi.myapplication"
    android:targetClass="com.example.zengyazhi.myapplication.Main1Activity" />
    <intent
    android:action="android.intent.action.VIEW"
    android:targetPackage="com.example.zengyazhi.myapplication"
    android:targetClass="com.example.zengyazhi.myapplication.Main2Activity" />
    <categories android:name="android.shortcut.conversation" />
    </shortcut> <shortcut
    android:shortcutId="shortCutId2"
    android:enabled="true"
    android:icon="@drawable/icon_google"
    android:shortcutShortLabel="@string/compose_shortcut_short_label2"
    android:shortcutLongLabel="@string/compose_shortcut_long_label2"
    android:shortcutDisabledMessage="@string/compose_disabled_message2">
    <intent
    android:action="android.intent.action.VIEW"
    android:targetPackage="com.example.zengyazhi.myapplication"
    android:targetClass="com.example.zengyazhi.myapplication.Main2Activity" />
    <categories android:name="android.shortcut.conversation" />
    </shortcut>

解释一下shortcut标签里的各个的属性:

  • shortcutId:shortcuts的ID
  • enabled:如果为false则不会在长按shortcuts列表中显示
  • icon:shortcuts的图标
  • shortcutShortLabel:当shortcuts固定到桌面时的标题(注意字符串只能使用string资源文件引用,不可以直接使用字符串)
  • shortcutLongLabel:长按app出现shortcuts时的标题,如果太长或未设置默认会显示shortcutShortLabel
  • shortcutDisabledMessage: 当pinned shortcuts不可用时的toast提示信息
  • shortcuts标签内的标签可以有多个,例如页面1、页面2、页面3,用户点击shortcuts后进入的是列表的最后一个(即页面3),并且可以依次回退到页面2、页面1.

动态shortcuts(Dynamic Shortcuts)的使用

使用ShortcutManager相关API来创建、更新、移除shortcuts。几种API的使用方法都类似。

  1. 使用 setDynamicShortcuts() 和 addDynamicShortcuts() 来动态增加shortcuts。这两个方法有点相似,使用时要注意区别。

    addDynamicShortcuts():添加shortcuts,如果存在相同的ID的shortcuts则更新信息。

    setDynamicShortcuts():替换掉已有的动态shortcuts列表,如果存在相同的ID的shortcuts则更新信息。举个例子:

    例如原本有shortcuts列表:
  • 标签一(lable:张三, id:one)

  • 标签二(lable:李四, id:two)

  • 标签三(lable:王五, id:three)

    使用 setDynamicShortcuts() 方法并传入两个ShortcutInfo:

  • 标签三(lable:赵六, id:three)

  • 标签四(lable:钱七, id:four)

    调用方法后会使shortcuts列表则变为:

  • 标签三(lable:赵六, id:three)

  • 标签四(lable:钱七, id:four)

    因为标签三的ID相同,所以更新标签三,而shortcuts列表中原来的标签一、二被移除,而且一开篇介绍shortcuts时也提到过是:如果shortcuts已被固定到桌面成为pinned shortcuts,即使shortcuts从列表中被移除了,但桌面的pinned shortcuts依然可以正常使用,除非你将其设置disable状态,即如果张三、李四被固定到桌面,即使调用 setDynamicShortcuts() 后长按app不会显示张三、李四,但桌面上的张三李四不会消失且可以正常使用。

  1. 使用 updateShortcuts() 更新shortcuts的信息

    ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
    ShortcutInfo shortCutId1 = new ShortcutInfo.Builder(MainActivity.this, "shortCutId3")
    .setShortLabel("更改桌面标签3")
    .setLongLabel("更改快捷方式标签3")
    .setIcon(Icon.createWithResource(this, R.drawable.icon_chrome))
    .setDisabledMessage("更改不可用时提示信息3")
    .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com/"), this, Main1Activity.class))
    .build();
    shortcutManager.updateShortcuts(Arrays.asList(shortCutId1, shortCutId4));

    动态shortcuts也可以像静态shortcuts一样同时添加多个intent意图

    Intent intent1 = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com/"), this, Main1Activity.class);
    Intent intent2 = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com/"), this, Main2Activity.class);
    Intent[] intents = {intent1, intent2}; ...
    .setIntents(intents)
    .build();
    ...
  2. 使用 removeDynamicShortcuts() 移除单个或多个动态shortcuts,使用 removeAllDynamicShortcuts() 移除所有的动态shortcuts

    shortcutManager.removeDynamicShortcuts(Arrays.asList("shortCutId31", "shortCutId4"));
    
    shortcutManager.removeAllDynamicShortcuts();
  3. 设置shortcuts为不可用状态:

    shortcutManager.disableShortcuts(Arrays.asList("shortCutId3"));
    //另一个重载的方法,可以在用户点击该shortcuts时显示错误信息
    shortcutManager.disableShortcuts(Arrays.asList("shortCutId4"), "快捷方式4已不可用");

需要注意的是:以上API只能操作动态shortcuts(包括pinned shortcuts),不可操作静态shortcuts,如果传入静态shortcuts的id会报IllegalArgumentException错误:Manifest shortcut ID=*** may not be manipulated via APIs

追踪shortcuts的使用

官网文档中提到以下两种情景需要调用reportShortcutUsed():

  1. 用户点击了shortcuts

  2. 用户操作了与shortcuts关联的操作

上报shortcuts的使用来预测shortcuts的优先级,帮助开发者更好得使用shortcuts。

shortcuts设计规范

App Shortcuts Design Guidelines

Android从material design设计规范推出开始到今天的Android7,个人觉得真的是不输iOS,然而至今没有广泛地被推崇,实在令人不免一声叹息。另外手上2013年发布的Nexus5升级Android7之后竟然感觉比以前还顺滑,什么叫良心?跟我一起大喊:Google大法好!

App Shortcuts 快捷方式:Android 的 '3D Touch'的更多相关文章

  1. Android 7.1 App Shortcuts使用

    Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...

  2. Android 7.1 - App Shortcuts

    Android 7.1 - App Shortcuts 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Shortcuts 文中如有纰漏,欢迎大家留言 ...

  3. Android 7.1.1 之实现 3D Touch

    转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/68962736 Shortcut概念 详细实现 BuildConfig 配置 静态 ...

  4. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  5. 微信成为首批支持iPhone 6s /Plus 上 3D Touch 功能的 App

    2015苹果新品发布会上微信成为首批支持iPhone 6s 和 iPhone 6s Plus 上 3D Touch 功能的 App.通过 3D Touch,微信用户将可以通过更精减的操作完成基本任务, ...

  6. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  7. iOS开发 - 3D Touch 应用系列一 - Quick Actions 创建桌面 Icon 快捷方式

    个言 很久没发随笔了,有一年多了吧.期间也曾想继续去写随笔,但是因为各种原因而耽搁了.最近又想了一下,还是有很多东西想要写,想要分享,想要记录下来的东西.之后我也会不断写随笔,但不止于 iOS 的方向 ...

  8. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  9. 3D touch 的 应用 --备用

    在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch技术.3D Touch的触控技术,被苹果称为新一代多点触控技术.其实,就是此前在Apple Watch上采用的For ...

随机推荐

  1. 【抓取】6-DOF GraspNet 论文解读

    [抓取]6-DOF GraspNet 论文解读 [注]:本文地址:[抓取]6-DOF GraspNet 论文解读 若转载请于明显处标明出处. 前言 这篇关于生成抓取姿态的论文出自英伟达.我在读完该篇论 ...

  2. LeetCode 019 Remove Nth Node From End of List

    题目描述:Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...

  3. python 爬虫 汽车之家车辆参数反爬

    水平有限,仅供参考. 如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被CSS伪类替换. 观察 Sources 发现数据就在当前页面. 发现若干条进行CSS替换的js 继续深入此JS 知道了数据 ...

  4. 如何破解QQ闪照

    1.如何下载 通过公主公众号 "全是软件" 然后输入 294 即可获得下载链接 https://qsrj.lanzous.com/iU4Hddnnmne 目前的闪照破解工具只能破解 ...

  5. SpringBoot打包成Docker镜像

    1. 本文环境 Maven:3.6.3(Maven配置参考) SpringBoot version:2.3.4.RELEASE Docker version: 19.03.11(Docker搭建参考) ...

  6. Spring Cloud Alibaba 初体验(三) Nacos 与 Dubbo 集成

    一.新建项目 新建项目,只放置接口,用于暴露 Dubbo 服务接口 public interface GreetingService { String greeting(); } 二.provider ...

  7. 部署完的Django项目升级为HTTPS

    1.阿里云上申请免费ssl证书--->提交各种资料--->等待审核--->下载证书. 2.远程连接阿里云服务器,将下载下来的证书内容复制到Nginx安装目录下的cert目录(需要新建 ...

  8. 简单dp水题

    #include <bits/stdc++.h> using namespace std; #define limit (100 + 5)//防止溢出 #define INF 0x3f3f ...

  9. 为什么Python中称__lt__、__gt__等为“富比较”方法

    Python中基类object提供了一系列可以用于实现同类对象进行"比较"的方法,可以用于同类对象的不同实例进行比较,包括__lt__.__gt__.__le__.__ge__._ ...

  10. 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'

    在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...