Android基础知识---7.1新特性:Shortcuts详解
来源:互联网 发布:工商网络监管情况 编辑:程序博客网 时间:2024/05/01 17:02
啊啊,最近转做游戏就没什么时间写博客了,累死了!不过看到了7.1的新特性还是忍不住来看看!
Shortcuts介绍
Android7.1(API Level 25)及以上系统可以自定义Shortcuts,通过在桌面上长按App Icon弹出Shortcut列表,点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。长按列表中的任一个Shortcut可拖动到桌面进行固定(可以成为Pinned Shortcut)。
虽然网上都有说,但是不得不说,却被带入了坑。
首先明确几点:
- 首先使用方法要判断版本。
- 必须你的手机是7.0以上的,(没有就下载对应的模拟器,不然写再多也不会显示)。
- 必须要在清代文件加上对应的权限。
一、Shortcuts的简单作用
每个Shortcut可以关联一个或多个intents,每个intent启动一个指定的action; 官方给出了几个可以作为shortcut的例子,比如:
- 在地图类app中,指导用户到特定的位置;
- 在游戏类app中,下载最后保存的要点;
- 发布动态的单独按钮;
在实际开发中,我们具体想让哪些操作作为快捷方式,可自行定义。
二、Shortcuts的分类及区别
主要分为两大类:
- Static Shortcuts : 静态快捷方式
- Dynamic Shortcuts : 动态快捷方式
区别:
静态Shortcuts只能通过升级应用来进行update;动态shortcuts可随时进行update
静态shortcuts的Intent无法设置Flag,默认为FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK,即应用运行中会清除所有已存在的Activity;动态shortcuts的Intent可以设置Flag
排序问题:静态shortcuts默认比动态shortcut离App Icon更近,而且无法动态改变静态shortcut的展示顺序,因为它们是按照shortcuts.xml文件中定义的顺序来显示的;动静shortcuts的排列顺序可以使用setRank(int)方法设置,int值越大,排序越高,即离App Icon越远。如下图:
tips:准备工作
首先确定api在gradle中
android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.admin.a3dtouch" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
然后在清单文件中设置权限
<!-- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <!-- 移除快捷方式 --> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> <!-- 查询快捷方式 --> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
2.1静态shortcuts的创建
首先:
在app的AndroidManifest.xml文件中,找到MainActivity,即设置了action为<action Android:name=”android.intent.action.MAIN” />,且category设置为 <category android:name=”android.intent.category.LAUNCHER” />的activity;为其添加<meta-data>….</meta-data>指向定义Shortcuts的资源文件。代码如下:
<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>
然后,创建定义AppShortcuts的资源文件,res/xml/shortcuts.xml文件
<?xml version="1.0" encoding="utf-8"?><shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@mipmap/ic_launcher" android:shortcutDisabledMessage="@string/shortcut_publish" android:shortcutId="publish" android:shortcutLongLabel="@string/shortcut_publish" android:shortcutShortLabel="@string/shortcut_publish"> <!-- 一个shortcut,当有多个intents与之相关联时,在用户启动该shortcut时,最先呈现给用户的是 <intent>...</intent>集合中最后一个intent操作事件。 即这里创建了一个intent的回退栈,最后一个才是被快捷方式打开的那个。 --> <intent android:action="android.intent.action.VIEW" android:targetClass="com.example.admin.a3dtouch.Main2Activity" android:targetPackage="com.example.admin.a3dtouch" /> <intent android:action="android.intent.action.VIEW" android:targetClass="com.example.admin.a3dtouch.MainActivity" android:targetPackage="com.example.admin.a3dtouch" /> <categories android:name="android.shortcut.conversation" /> </shortcut></shortcuts>
以shortcuts元素为根,可以包含多个shortcut元素,每个shortcut元素标示一个shortcut。其中属性分别标示:
- shortcutId:shortcut唯一标识符,相同的shortcutId会被覆盖。(必设属性)
- enable:shortcut是否启用,true启用,false是禁用(若设置为false,不如删除掉该快捷方式)(可选属性)
- icon:显示在快捷方式左边的图标。(可选属性)
- shortcutLongLabel:当launcher的空间足够时将会显示shortcut的长文本描述,不宜过长,如果过长或未设置时会显示shortcutShortLabel (可选属性)
- shortcutShortLabel : shortcut的简要说明,这项是必须的。(必设属性)
- intent : 这里定义快捷方式被点击之后将会打开的intent (必设属性)
- shortcutDisabledMessage : 当你禁用了shortcut之后,它将不会显示在用户长按应用图标后打开的快捷方式里,但是用户可以把一个快捷方式拖拽到launcher的某个页面成为Pinned Shortcut,被禁用之后这个快捷方式就会显示为灰色,点击这个Pinned Shortcut则会显示一个内容为shortcutDisabledMessage的Toast。(可选属性)
-
2.2 动态shortcuts的创建
直接代码部署就好了
public class MainActivity extends AppCompatActivity { ShortcutInfo scInfoTwo; ShortcutManager scManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //要确保API Level 大于等于 25才可以创建动态shortcut,否则会报异常。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { initDynamicShortcuts(); } } /** * 为App创建动态Shortcuts */ private void initDynamicShortcuts() { //1、创建动态快捷方式的第一步,创建ShortcutManager scManager = getSystemService(ShortcutManager.class); //2、构建动态快捷方式的详细信息 ShortcutInfo scInfoOne = new ShortcutInfo.Builder(this, "dynamic_one") .setShortLabel("Dynamic Web site") .setLongLabel("to open Dynamic Web Site") .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher)) .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))) .setDisabledMessage("不存在的") .build(); scInfoTwo = new ShortcutInfo.Builder(this, "dynamic_two") .setShortLabel("Dynamic Activity") .setLongLabel("to open dynamic one activity") .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher)) .setIntents(new Intent[]{ new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),//加该FLAG的目的是让MainActivity作为根activity,清空已有的任务 new Intent(DynamicASOneActivity.ACTION) }) .build(); //3、为ShortcutManager设置动态快捷方式集合 scManager.setDynamicShortcuts(Arrays.asList(scInfoOne, scInfoTwo)); //4如果想为两个动态快捷方式进行排序,可执行下面的代码 ShortcutInfo dynamicWebShortcut = new ShortcutInfo.Builder(this, "dynamic_one") .setRank(1) .build(); ShortcutInfo dynamicActivityShortcut = new ShortcutInfo.Builder(this, "dynamic_two") .setRank(0) .build(); //5、更新快捷方式集合 scManager.updateShortcuts(Arrays.asList(dynamicWebShortcut, dynamicActivityShortcut)); }}
ShortcutManager API可以帮助我们实现新建、更新、移除快捷方式的操作:
- 新建:方法setDynamicShortcuts() 可以添加或替换所有的shortcut;方法addDynamicShortcuts() 来添加新的shortcut到列表中,超过最大个数会报异常
- 更新:方法updateShortcuts(List shortcutInfoList) 更新已有的动态快捷方式;
- 删除:方法removeDynamicShortcuts(List shortcutIds) 根据动态快捷方式的ID,删除已有的动态快捷方式;方法removeAllDynamicShortcuts() 删除掉app中所有的动态快捷方式;
List getDynamicShortcuts() : 得到所有的动态shortcuts;
2.3 禁用Shortcuts
Pinned Shortcuts:指用户通过拖拽任到桌面上的Shortcuts,App不可以动态添加、修改、删除这些Shortcuts,只能禁用它们。即便App内删除了某个Shortcut,对应的Pinned Shortcut也不会被删除。Pinned Shortcuts 并没有个数限制,并且Pinned Shortcut 对应的 Shortcut 即便被动态删除了,依然可以通过 id 进行 Update 操作。
一般是下面两种情况:
- disableShortcuts(List shortcutIds) 或 disableShortcuts(List<String> shortcutIds, CharSequence disabledMessage) 禁用动态的快捷方式。
- 如果在APP版本升级时删除了某个静态快捷方式,那么系统会自动的禁用相应的static shortcuts;
给个栗子:(刚刚的代码加上一段)
Button btn_click = (Button) findViewById(R.id.btn_click); btn_click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { scManager.removeAllDynamicShortcuts(); List<String> list = new ArrayList<String>(); list.add("dynamic_two"); scManager.disableShortcuts(list); } });
效果图如下:
可以看到变成了灰色
##2.4 频率限制
当App完全退到后台(无 Activity 或 Service 在前台时),其操作 Shortcut(包括添加、删除、修改) 的频率是受限的。可通过isRateLimitingActive()查询是否已受限,true表示已受限。
如果在开发或测试过程中,偶遇了频率限制的情况,可通过开发者选项中“重置 ShortcutManager 调用频率限制”或命令行 adb shell cmd shortcut reset-throttling [ –user USER-ID ] 解决。
注意的地方
- 最多创建4个特定的shortcuts:目前虽然说Static shortcuts 和Dynamic shortcuts之和最多为5个,但实际上只会显示4个。当我们尝试添加第六个shortcut时, 应用会抛出异常: Java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded.
- 限制 Label 长度:其中shortcutShortLabel建议不超过 10 个字符,shortcutLongLabel 建议不超过 25 个字符。
- 如何更好的删除(废弃)老的 Shortcut
这里主要考虑到删除老的 Shortcut,可能会影响已经固定的 Shortcut。
对于静态 Shortcuts,直接删除配置文件中对应的 Shortcut 即可,系统桌面会将已固定的该 Shortcut 置灰,点击会提示 shortcutDisabledMessage。
对于动态 Shortcuts 建议通过禁用的方式而不是直接删除的方式,因为已经删除的动态 Shortcut 如果被固定了依然是可用的,所以希望该入口不可用最好的方式是禁用。
- Android基础知识---7.1新特性:Shortcuts详解
- Android 7.1 新特性:快捷方式 Shortcuts 详解
- Android 7.1 新特性之 Shortcuts运用
- Android7.1新特性:快捷方式Shortcuts详解
- Android基础知识:android新特性
- Android7.1新特性 App Shortcuts
- Android基础知识(十一)之新特性
- Android 7.1 快捷方式 Shortcuts
- Android 7.1 Shortcuts功能
- Android 7.1新特性
- android7.1新特性 App Shortcuts 图标快捷启动
- android 7.1快捷方式App Shortcuts
- Android 7.1 App Shortcuts使用
- Android 7.1 App Shortcuts使用
- Android 4.1果冻豆新特性详解
- Android 4.1果冻豆新特性详解
- Android新特性Instant Run详解
- Android新特性Instant Run详解
- 拷贝构造函数
- HBase性能优化方法总结
- 使用Java MD5 为文件和字符串加密
- Dom
- 行为型设计模式-迭代器模式
- Android基础知识---7.1新特性:Shortcuts详解
- 学员笔记展示 临时表
- JVM结构、GC工作机制详解
- android 软键盘和布局的冲突
- 一文讲透区块链技术原理
- 爬取国内主流电影网站的电影更新情况
- 放大镜jquery
- 高精度加法的c语言实现
- Android存储对象到本地(SharedPreferences方式和file方式)