笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述安卓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【安卓7.1 新特性Shortcut】解决:先获取其已有的快捷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));
}
效果:
文章图片
动态写法 -删除(不可用)
下面一小段描述转载的(我不想写,再说次作者写这个描述非常不错此段描述原作者地址)我们在桌面长按拖出来的快捷item到桌面 这个item对象为ShortcutInfo
我们先来介绍一个名词-Pinning Shortcuts, 这是个啥玩意呢? 其实对于Shortcut, Android是允许我们直接放到桌面的, 这样就更加方便了用户的操作, google把他称作为Pinning Shortcuts, 具体啥样, 我们来张图就明白了.
文章图片
对于这个Pinning Shortcuts, google的文档说, 我们开发者是没有权利去删除的, 能删除它的只有用户. 那我该项功能删除了咋办? 这东西还在桌面上, 是不是APP要崩? 当然Google考虑到了这点, 它允许我们去disable这个shortcut. 让其变为灰色 用户点击时提示个小土司
好了引用结束 感谢原作者
代码是最好的老师:
//删除
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会被删除
推荐阅读
- 搭建Eclipse+ADT+Android SDK 安卓开发环境
- Android群英传笔记系列一view的介绍
- Android 进程通信机制之 AIDL
- Android单元测试与模拟测试详解
- 安卓 代码混淆与打包
- Android中JNI的使用方法
- Android平台安全概念篇
- Android activity和service的生命周期对比
- Android开发,Eclipse创建aidl接口时,出错