安卓7.1 新特性Shortcut
介绍
Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按. 
来看下效果吧: 
  
是不是很赞? 那么请随本文一起学习吧
更新
- 新建项目 在你项目下的build.gradle下 - 以下目的很简单更新你编译工具 和指定项目版本 - compileSdkVersion 25
- buildToolsVersion “25.0.0”
- minSdkVersion 25
- targetSdkVersion 25
 
- 更新platform-tools 到25 
 打开SDK Manager
 
 如果你的Android SDK Platform-tools小于25那么请勾选然后点右下角更新
静态写法
静态写法?说白了和BroadcastReceiver(广播接受者)一样 .一个在清单文件中注册广播我们称为静态,用代码注册称为动态
- 在res创建xml文件夹 
 
- 在res/xml下新建一个文件命名为my_shortcut.xml字符串貌似必须引用方法比如@string/xxxx 
 具体内容- <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
 <shortcut
 android:shortcutId="settings"
 android:enabled="true"
 android:icon="@mipmap/ic_launcher"
 android:shortcutShortLabel="@string/my_short"
 android:shortcutLongLabel="@string/my_long"
 android:shortcutDisabledMessage="@string/my_disable">
 <intent
 android:action="android.intent.action.VIEW"
 android:targetPackage="com.example.administrator.myapplication"
 android:targetClass="com.example.administrator.myapplication.MainActivity" />
 <intent
 android:action="android.intent.action.VIEW"
 android:targetPackage="com.example.administrator.myapplication"
 android:targetClass="com.example.administrator.myapplication.SettingsActivity" />
 <categories android:name="android.shortcut.conversation"/>
 </shortcut>
 </shortcuts>- 参数说明 - shortcut 属性说明: 
 android:shortcutId 就是一个id标志 后面动态注册会讲到
 android:enabled 是否可用 如果不可用那么将不显示此快捷
 android:shortcutShortLabel 快捷短名:大家注意到一开始的效果图没?快捷是可以脱出来在变成一个桌面快捷方式图标.那么此图标的名字就是这个
 android:shortcutLongLabel :快捷长名 长按下图标弹出来列表框中每个快捷名
 android:shortcutDisabledMessage: 当快捷不可用时用户点击会提示此文字 后面动态会详细说明
 intent属性说明:- 假设1:shortcut (看清楚不是shorcuts 没有s哦)下只有一个intent 那么结果:用户点击此快捷用户跳转到intent制定的activity - 假设2:shortcut 下有两个intent 我们按照顺序命名为intent1 和intent2 那么用户点击快捷的时候将会跳转到intent2 此时 若用户按下back键(返回键) 那么将会跳转到intent1的界面 - categories 属性说明 
 反正就一个值就是上面写的 写死即可
- 在清单文件注册 
 注意一个小坑:注册信息必须要在activity为启动项的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-data
 android:name="android.app.shortcuts"
 android:resource="@xml/my_shortcut"/>
 </activity>- 做法如下: 
 下面少打错了”android.app.shortcuts” 下面少打了个s (电脑实在太卡了,不想重录)注意!!!!!!!!
 
- 效果展示: 
 
- 小知识点 
 假如:你打开快捷item的程序所在的应用已经有多个activity在回退栈 请猜猜会怎么样?这里留给读者自行尝试..哪怕什么都没有反生你也可以增加记忆嘛
动态写法 -添加
特点和广播接受者一样灵活
核心代码(本例只要点击”创建”按钮会执行下面方法生成快捷):
 //动态添加
    public void onclick2(View view) {
        mShortcutManager = getSystemService(ShortcutManager.class);
        List<ShortcutInfo> infos = new ArrayList<>();
        //快捷最多只能有5个
        // getMaxShortcutCountPerActivity只能返回5
        for (int i = 0; i < mShortcutManager.getMaxShortcutCountPerActivity(); i++) {
            Intent intent = new Intent(this, SettingsActivity.class);
            intent.setAction(Intent.ACTION_VIEW);
            Intent intent2 = new Intent();
            intent2.setAction("fmy.fmy");
            intent2.setClassName(getPackageName(),getPackageName()+".MainActivity.java");
            Intent[] intents = new Intent[2];
            //开始点击快捷时跳进此 返回键跳入intent2 其他类似
            intents[0]=intent;
            intents[1]=intent2;
                //第一个参数 上下文
                //第二个参数id嘛
            ShortcutInfo info = new ShortcutInfo.Builder(this, "id" + i)
                    .setShortLabel("短的名字"+i+"")
                    .setLongLabel("长的名字:" + i+"")
                    .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
//                   .setIntent(intent)
                    .setIntents(intents)
                    .build();
            infos.add(info);
        }
        mShortcutManager.setDynamicShortcuts(infos);
    }效果:
解析:下图我一开始没有点击”创建”按钮 直接在桌面长按按钮发现没有任何反应.然后进入程序按下创建按钮并返回桌面发现可以长按点出快捷
注意和静态写法一起的坑(算本人经验吧):
那些年我们一起踩过的坑—>>上面的代码会动态创建5个快捷点击item.但是如果你此时静态写一个了快捷item那么恭喜你见红了(出现异常)
Caused by: java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded
解决:先获取其已有的快捷item数量然后要么移除原来的,要么减少你创建.或者更新 这就是我为什么知道只能创建5个原因.解决方法读者看完 “动态写法-更新(覆盖)”和”动态写法-删除”自然会明白,如果想先解决问题那么请直接拷贝 更新 和 删除 中部分核心代码
动态写法 -更新(覆盖)
如果你想某些时候改变某些快捷item的名字或者意图(intent)那么请参照以下代码
 public void onclick3(View view) {
        Intent intent2 = new Intent();
        intent2.setAction("fmy.fmy");
        intent2.setClassName(getPackageName(),getPackageName()+".MainActivity.java");
//设置id为id1 会覆盖原来快捷item为id为id1的快捷
//如果没有则什么都不会发生
        ShortcutInfo info = new ShortcutInfo.Builder(this,"id1")
                .setIntent(intent2)
                .setLongLabel("动态更新的长名")
                .setShortLabel("动态更新的短名")
                .build();
        mShortcutManager = getSystemService(ShortcutManager.class);
        List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts();
        mShortcutManager.updateShortcuts(Arrays.asList(info));
    }效果: 
动态写法 -删除(不可用)
下面一小段描述转载的(我不想写,再说次作者写这个描述非常不错此段描述原作者地址)
我们先来介绍一个名词-Pinning Shortcuts, 这是个啥玩意呢? 其实对于Shortcut, Android是允许我们直接放到桌面的, 这样就更加方便了用户的操作, google把他称作为Pinning Shortcuts, 具体啥样, 我们来张图就明白了.

对于这个Pinning Shortcuts, google的文档说, 我们开发者是没有权利去删除的, 能删除它的只有用户. 那我该项功能删除了咋办? 这东西还在桌面上, 是不是APP要崩? 当然Google考虑到了这点, 它允许我们去disable这个shortcut. 让其变为灰色 用户点击时提示个小土司
好了引用结束 感谢原作者
我们在桌面长按拖出来的快捷item到桌面 这个item对象为ShortcutInfo 
代码是最好的老师:
//删除
    public void onclick(View view) {
        mShortcutManager = getSystemService(ShortcutManager.class);
        //获取所有被拉取出来的快捷item(如果一个item都没有被拉出那么返回长度为0)
        List<ShortcutInfo> infos = mShortcutManager.getPinnedShortcuts();
        //遍历所有的被拉出的item 然后让其变成灰色不可点击
        for (ShortcutInfo info :
                infos ) {
            //此时被拉出的快捷item 变为灰色 用户再点击 会弹出吐司内容为第二个参数 "不可点击哦"
           // 此时桌面长按原程序图标弹出的快捷列表已经没有了
            mShortcutManager.disableShortcuts(Arrays.asList(info.getId()), "不可点击哦");
            List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts();
            Log.e("TAG","大小"+dynamicShortcuts.size());
            //虽然不可见但是你 依然要移除在动态添加列表里的东西 不过我调用disableShortcuts
            // 后发现其大小变了.内部应该调用此方法了.由于电脑太卡没下载源码 所以保险起见写上吧
            mShortcutManager.removeDynamicShortcuts(Arrays.asList(info.getId()));
        }
        List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts();
        Log.e("TAG","大小"+dynamicShortcuts.size());
    }小知识点
- 用户删除数据时 被拖出来快捷item会被删除
- 用户删除数据时 动态创建的item 你在桌面在长按程序图标也没有 需要重新写入
- 用户卸载时被拖出来快捷item会被删除
关于这篇博文
我偶然看到这个7.1新特性 于是一直在找学习资料.然后想写下 期间看了几篇文章 并结合自己体会写下来.这篇博客用到模拟器要用SDK manager 下载镜像 因为只有它有7.1镜像 genymotion 最新的也就只有7.0 而已.运行谷歌自带镜像及其耗费内存 我就4G内存 开完stuio和博客和模拟器 内存只剩下80mb 卡的程度可想而知.但是一直想写一篇高质量的博文.于是硬着头皮卡了5个小时写下了.由于时间仓促错漏在所难免,由于卡到不行不敢点击源码去看 而且我也没下载.如果以上文字对你有那么一点带你帮助 将是我最大的欣慰;
安卓7.1 新特性Shortcut的更多相关文章
- 安卓5.0新特性之Palette
		根据图片来决定标题的颜色和标题栏的背景色,这样视觉上更具有冲击力和新鲜感,而不像统一色调那样呆板. Palette这个类能提取以下突出的颜色: Vibrant(充满活力的) Vibrant dark( ... 
- 安卓6.0新特性在Fragment申请运行时权限
		今天在Fragment申请权限时代码如下: public void getContacts(){ int flag = ActivityCompat.checkSelfPermission(getAc ... 
- 【SAP BO】BOE 4.1版本新特性
		为了更好地向用户推广BusinessObjects BI 4.1版本的新特性,SAP公司宣布将在2012年中旬推出针对BusinessObjects BI 4.0的功能补丁程序(Feature Pac ... 
- iOS10新特性之CallKit开发详解:锁屏接听和来电识别
		国庆节过完了,回家好好休息一天,今天好好分享一下CallKit开发.最近发现好多吃瓜问CallKit的VoIP开发适配,对iOS10的新特性开发和适配也在上个月完成,接下来就分享一下VoIP应用如何使 ... 
- ios9和ios10的新特性
		昨天面试了一个做ios开发的公司,其中面试官问我最新的ios系统版本是多少,以及它的特性是什么?由于自己是初学者,所以对这些没有关注过.今天特地搜索了一下关于ios9和ios10的新特性,并整理了一下 ... 
- iOS开发——新特性OC篇&IOS9 SDK新特性
		iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ... 
- Android 7.0(牛轧糖)新特性
		Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ... 
- 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南
		欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ... 
- 业余草分享 Spring Boot 2.0 正式发布的新特性
		就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ... 
随机推荐
- requests post一个json数据
			# post一个json数据 import requests headers={ "Accept":"application/json, text/plain, */*& ... 
- 解决:My97DatePicker 日期插件引用在PHP文件中maxDate和minDate控制失效问题
			开发环境: 语言:PHP 框架:ThinkPHP 问题:在引用插件My97DatePicker时,想实现:开始日期不能大于结束日期,结束时间不能小于开始时间 步骤一.查看文档官方文档http://ww ... 
- .NET面试资料整理
			1.WCF和Web Api的区别答:1WCF是.NET平台开发的一站式框架,Web Api的设计和构建只考虑一件事情,那就是Http,而WCF的设计主要考虑是SOAP和WS-*:Web Api非常轻量 ... 
- python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法
			一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstan ... 
- drupal8主题安装
			一.在网站上下载一个主题包 在 https://www.drupal.org/project/bootstrap 下下载的bootstrop主题 二.下载之后,解压放在d8game/themes目录下 ... 
- Redis数据类型--string
			在Redis中支持丰富的数据类型的存储系统,包括:字符串(string),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets),与范围查询,bitmaps,h ... 
- [HNOI 2015]实验比较
			Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ... 
- [Sdoi2009]Elaxia的路线
			Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ... 
- 51 nod 1406 与查询
			1406 与查询 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有n个整数.输出他之中和x相与之后结果为x的有多少个.x从0 ... 
- POJ 2289(多重匹配+二分)
			POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ... 
