保存到桌面加入收藏设为首页
IOS开发
当前位置:首页 > IOS开发

Android7.1新特性Shortcut-安度博客

时间:2019-02-08 15:56:43   作者:   来源:   阅读:137   评论:0
内容摘要:介绍Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按.来看下效果吧:是不是很赞? 那么请随本文一起学习吧更新新建项目 在你项目下的build.gradle下以下目的很简单更新你编译工具 和指定项目版本compileSd......
  • 介绍

    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=&#39;http://schemas.android.com/apk/res/android&#39;> <shortcut android:shortcutId=&#39;settings&#39; android:enabled=&#39;true&#39; android:icon=&#39;@mipmap/ic_launcher&#39; android:shortcutShortLabel=&#39;@string/my_short&#39; android:shortcutLongLabel=&#39;@string/my_long&#39; android:shortcutDisabledMessage=&#39;@string/my_disable&#39;> <intent android:action=&#39;android.intent.action.VIEW&#39; android:targetPackage=&#39;com.example.administrator.myapplication&#39; android:targetClass=&#39;com.example.administrator.myapplication.MainActivity&#39; /> <intent android:action=&#39;android.intent.action.VIEW&#39; android:targetPackage=&#39;com.example.administrator.myapplication&#39; android:targetClass=&#39;com.example.administrator.myapplication.SettingsActivity&#39; /> <categories android:name=&#39;android.shortcut.conversation&#39;/> </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 我们按照顺序命名为intent1intent2 那么用户点击快捷的时候将会跳转到intent2 此时 若用户按下back键(返回键) 那么将会跳转到intent1的界面

    categories 属性说明
    反正就一个值就是上面写的 写死即可

    在清单文件注册
    注意一个小坑:注册信息必须要在activity为启动项的activity的根标签注册写下<meta-data>

     <activity android:name=&#39;.MainActivity&#39;> <intent-filter> <action android:name=&#39;android.intent.action.MAIN&#39; /> <category android:name=&#39;android.intent.category.LAUNCHER&#39; /> </intent-filter> <meta-data android:name=&#39;android.app.shortcuts&#39; android:resource=&#39;@xml/my_shortcut&#39;/> </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(&#39;fmy.fmy&#39;); intent2.setClassName(getPackageName()getPackageName()+&#39;.MainActivity.java&#39;); Intent[] intents = new Intent[2]; //开始点击快捷时跳进此 返回键跳入intent2 其他类似 intents[0]=intent; intents[1]=intent2; //第一个参数 上下文 //第二个参数id嘛 ShortcutInfo info = new ShortcutInfo.Builder(this &#39;id&#39; + i) .setShortLabel(&#39;短的名字&#39;+i+&#39;&#39;) .setLongLabel(&#39;长的名字:&#39; + i+&#39;&#39;) .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(&#39;fmy.fmy&#39;); intent2.setClassName(getPackageName()getPackageName()+&#39;.MainActivity.java&#39;);//设置id为id1 会覆盖原来快捷item为id为id1的快捷//如果没有则什么都不会发生 ShortcutInfo info = new ShortcutInfo.Builder(this&#39;id1&#39;) .setIntent(intent2) .setLongLabel(&#39;动态更新的长名&#39;) .setShortLabel(&#39;动态更新的短名&#39;) .build(); mShortcutManager = getSystemService(ShortcutManager.class); List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts(); mShortcutManager.updateShortcuts(Arrays.asList(info)); }

    效果:
    这里写图片描述

    动态写法 -删除(不可用)

    下面一小段描述转载的(我不想写再说次作者写这个描述非常不错此段描述原作者地址)
    我们先来介绍一个名词-Pinning Shortcuts 这是个啥玩意呢? 其实对于Shortcut nk" target="_blank">Android是允许我们直接放到桌面的 这样就更加方便了用户的操作 google把他称作为Pinning Shortcuts 具体啥样 我们来张图就明白了.
    这里写图片描述
    对于这个Pinning Shortcuts google的文档说 我们开发者是没有权利去删除的 能删除它的只有用户. 那我该项功能删除了咋办? 这东西还在桌面上 是不是APP穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qqxwD8gtbHIu0dvb2dsZb+8wse1vcHL1eK14ywgy/zUytDtztLDx8ilZGlzYWJsZdXiuPZzaG9ydGN1dC4gyMPG5LHkznk" target="_blank">qq70smrINPDu6e147v3yrHM4cq+uPbQoc3By748YnIgLz4KCbrDwcvS/dPDveHK+CC40NC71K3X99XfPC9wPgo8L2Jsb2NrcXVvdGU+CjxwPs7Sw8fU2tfAw+azpLC0zc+z9sC0tcS/7L3daXRlbbW918DD5iDV4rj2aXRlbbbUz/POqlNob3J0Y3V0SW5mbzxiciAvPgq0+sLrysfX7rrDtcTAz8qmOjwvcD4KPHByZSBjbGFzcz0="brush:java;">//删除public void onclick(View view) {mShortcutManager = getSystemService(ShortcutManager.class);//获取所有被拉取出来的快捷item(如果一个item都没有被拉出那么返回长度为0)List<ShortcutInfo> infos = mShortcutManager.getPinnedShortcuts();//遍历所有的被拉出的item 然后让其变成灰色不可点击for (ShortcutInfo info :infos ) {//此时被拉出的快捷item 变为灰色 用户再点击 会弹出吐司内容为第二个参数 &#39;不可点击哦&#39;// 此时桌面长按原程序图标弹出的快捷列表已经没有了mShortcutManager.disableShortcuts(Arrays.asList(info.getId()) &#39;不可点击哦&#39;);List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts();Log.e(&#39;TAG&#39;&#39;大小&#39;+dynamicShortcuts.size());//虽然不可见但是你 依然要移除在动态添加列表里的东西 不过我调用disableShortcuts// 后发现其大小变了.内部应该调用此方法了.由于电脑太卡没下载源码 所以保险起见写上吧mShortcutManager.removeDynamicShortcuts(Arrays.asList(info.getId()));}List<ShortcutInfo> dynamicShortcuts = mShortcutManager.getDynamicShortcuts();Log.e(&#39;TAG&#39;&#39;大小&#39;+dynamicShortcuts.size());}

  • 小知识点

    用户删除数据时 被拖出来快捷item会被删除 用户删除数据时 动态创建的item 你在桌面在长按程序图标也没有 需要重新写入 用户卸载时被拖出来快捷item会被删除

    关于这篇博文

    我偶然看到这个7.1新特性 于是一直在找学习资料.然后想写下 期间看了几篇文章 并结合自己体会写下来.这篇博客用到模拟器要用SDK manager 下载镜像 因为只有它有7.1镜像 genymotion 最新的也就只有7.0 而已.运行谷歌自带镜像及其耗费内存 我就4G内存 开完stuio和博客和模拟器 内存只剩下80mb 卡的程度可想而知.但是一直想写一篇高质量的博文.于是硬着头皮卡了5个小时写下了.由于时间仓促错漏在所难免由于卡到不行不敢点击源码去看 而且我也没下载.如果以上文字对你有那么一点带你帮助 将是我最大的欣慰;


本站所有站内信息仅供娱乐参考,不作任何商业用途,不以营利为目的,专注分享快乐,欢迎收藏本站!
所有信息均来自:百度一下 (威尼斯人官网)