Android7.1新特性:快捷方式Shortcuts详解

article/2025/8/17 20:32:25

Shortcuts介绍

Android7.1(API Level 25)及以上系统可以自定义Shortcuts,通过在桌面上长按App Icon弹出Shortcut列表,点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。长按列表中的任一个Shortcut可拖动到桌面进行固定(可以成为Pinned Shortcut)。如下图:
这里写图片描述

1.1、Shortcuts的简单作用

每个Shortcut可以关联一个或多个intents,每个intent启动一个指定的action; 官方给出了几个可以作为shortcut的例子,比如:

  • 在地图类app中,指导用户到特定的位置;
  • 在社交类app中,发送消息给一个朋友;
  • 在媒体类app中,播放视频的下一片段;
  • 在游戏类app中,下载最后保存的要点;

在实际开发中,我们具体想让哪些操作作为快捷方式,可自行定义。

1.2、Shortcuts的分类及区别

主要分为两大类:

  • Static Shortcuts : 静态快捷方式
  • Dynamic Shortcuts : 动态快捷方式

区别:

  • 静态Shortcuts只能通过升级应用来进行update;动态shortcuts可随时进行update
  • 静态shortcuts的Intent无法设置Flag,默认为FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK,即应用运行中会清除所有已存在的Activity;动态shortcuts的Intent可以设置Flag
  • 排序问题:静态shortcuts默认比动态shortcut离App Icon更近,而且无法动态改变静态shortcut的展示顺序,因为它们是按照shortcuts.xml文件中定义的顺序来显示的;动静shortcuts的排列顺序可以使用setRank(int)方法设置,int值越大,排序越高,即离App Icon越远。如下图:
    这里写图片描述

1.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 --><shortcut
        android:shortcutId="static_one"android:enabled="true"android:icon="@mipmap/mika_icon_default"android:shortcutLongLabel="@string/static_one_long_label"android:shortcutDisabledMessage="@string/static_disabled_message"android:shortcutShortLabel="@string/static_one_short_label"><!--一个shortcut,当有多个intents与之相关联时,在用户启动该shortcut时,最先呈现给用户的是<intent>...</intent>集合中最后一个intent操作事件。即这里创建了一个intent的回退栈,最后一个才是被快捷方式打开的那个。--><intent
            android:action="android.intent.action.MAIN"android:targetPackage="com.example.appscdemo"android:targetClass="com.example.appscdemo.MainActivity"/><intent
            android:action="android.intent.action.MAIN"android:targetPackage="com.example.appscdemo"android:targetClass="com.example.appscdemo.StaticAppScOneActivity"/><intent
            android:action="android.intent.action.MAIN"android:targetPackage="com.example.appscdemo"android:targetClass="com.example.appscdemo.StaticAppScTwoActivity"/></shortcut><!-- 第二个静态shortcut --><shortcut
        android:shortcutId="static_two"android:enabled="true"android:shortcutLongLabel="@string/static_two_long_label"android:shortcutDisabledMessage="@string/static_disabled_message"android:shortcutShortLabel="@string/static_two_short_label"><intent
            android:action="android.intent.action.MAIN"android:targetPackage="com.example.appscdemo"android:targetClass="com.example.appscdemo.MainActivity"/><intent
            android:action="android.intent.action.MAIN"android:targetPackage="com.example.appscdemo"android:targetClass="com.example.appscdemo.StaticAppScTwoActivity"/></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。(可选属性)
    这里写图片描述

1.2.2、动态shortcuts的创建

代码创建Dynamic shortcut,需要使用API ShortcutManagerShortcutInfo.Builder;通过ShortcutInfo.Builder新建ShortcutInfo,再通过ShortcutManager添加即可。动态shortcut可以在运行时动态改变内容,无需重写部署App。下面直接看代码,而不在叙述创建的具体步骤:

public class MainActivity extends AppCompatActivity {@Overrideprotected 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() {//①、创建动态快捷方式的第一步,创建ShortcutManagerShortcutManager scManager = getSystemService(ShortcutManager.class);//②、构建动态快捷方式的详细信息ShortcutInfo scInfoOne  = new ShortcutInfo.Builder(this, "dynamic_one").setShortLabel("Dynamic Web site").setLongLabel("to open Dynamic Web Site").setIcon(Icon.createWithResource(this, R.mipmap.tool_music_icon)).setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))).build();ShortcutInfo scInfoTwo = new ShortcutInfo.Builder(this, "dynamic_two").setShortLabel("Dynamic Activity").setLongLabel("to open dynamic one activity").setIcon(Icon.createWithResource(this, R.mipmap.tool_luck_icon)).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();//③、为ShortcutManager设置动态快捷方式集合scManager.setDynamicShortcuts(Arrays.asList(scInfoOne, scInfoTwo));//如果想为两个动态快捷方式进行排序,可执行下面的代码ShortcutInfo dynamicWebShortcut = new ShortcutInfo.Builder(this, "dynamic_one").setRank(0).build();ShortcutInfo dynamicActivityShortcut = new ShortcutInfo.Builder(this, "dynamic_two").setRank(1).build();//④、更新快捷方式集合scManager.updateShortcuts(Arrays.asList(dynamicWebShortcut, dynamicActivityShortcut));}
}

效果如下图:

这里写图片描述

ShortcutManager API可以帮助我们实现新建、更新、移除快捷方式的操作:

  • 新建:方法setDynamicShortcuts() 可以添加或替换所有的shortcut;方法addDynamicShortcuts() 来添加新的shortcut到列表中,超过最大个数会报异常

  • 更新:方法updateShortcuts(List shortcutInfoList) 更新已有的动态快捷方式;

  • 删除:方法removeDynamicShortcuts(List shortcutIds) 根据动态快捷方式的ID,删除已有的动态快捷方式;方法removeAllDynamicShortcuts() 删除掉app中所有的动态快捷方式;

  • List<ShortcutInfo> getDynamicShortcuts() : 得到所有的动态shortcuts;

1.2.3、禁用Shortcuts

Pinned Shortcuts:指用户通过拖拽任到桌面上的Shortcuts,App不可以动态添加、修改、删除这些Shortcuts,只能禁用它们。即便App内删除了某个Shortcut,对应的Pinned Shortcut也不会被删除。Pinned Shortcuts 并没有个数限制,并且Pinned Shortcut 对应的 Shortcut 即便被动态删除了,依然可以通过 id 进行 Update 操作。

  • disableShortcuts(List<String> shortcutIds) 或 disableShortcuts(List&ltString> shortcutIds, CharSequence disabledMessage) 禁用动态的快捷方式。
  • 如果在APP版本升级时删除了某个静态快捷方式,那么系统会自动的禁用相应的static shortcuts;

1.2.4、频率限制

当App完全退到后台(无 Activity 或 Service 在前台时),其操作 Shortcut(包括添加、删除、修改) 的频率是受限的。可通过isRateLimitingActive()查询是否已受限,true表示已受限。
如果在开发或测试过程中,偶遇了频率限制的情况,可通过开发者选项中“重置 ShortcutManager 调用频率限制”或命令行 adb shell cmd shortcut reset-throttling [ –user USER-ID ] 解决。

1.3、最佳实践和需要注意的问题

  1. 遵循shortcuts设计指导方针:确保你的应用shortcuts在外观上和系统的shortcuts保持一致。AppShortscuts的Icons都是圆形。

    Shortcut Icon 简介:

    这里写图片描述

    Live Area:所有的Icon内容应该保持在44dp * 44dp的活动区域内,由一个实体的背景填充Material Grey 100 (or #F5F5F5)。
    Total Area:2dp的padding必须围绕在Live Area区域周围,使total Icon的大小为 48dp * 48dp。

    Standard Icons介绍:有一个Material System Icon居中与Live Area中间。

    这里写图片描述

    Single Avatar:单个头像作为Shortcut Icon时,效果如下图:
    这里写图片描述

    Group Avatars:多个头像拼成的Shortcut Icon,包含有2到4个图片在圆形的背景上,他们必须被创建在XXXHDPI文件中,效果如下图:

    这里写图片描述

  2. 最多创建4个特定的shortcuts:目前虽然说Static shortcuts 和Dynamic shortcuts之和最多为5个,但实际上只会显示4个。当我们尝试添加第六个shortcut时, 应用会抛出异常: java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded.

  3. 限制 Label 长度:其中shortcutShortLabel建议不超过 10 个字符,shortcutLongLabel 建议不超过 25 个字符。

  4. 如何更好的删除(废弃)老的 Shortcut
    这里主要考虑到删除老的 Shortcut,可能会影响已经固定的 Shortcut。
    对于静态 Shortcuts,直接删除配置文件中对应的 Shortcut 即可,系统桌面会将已固定的该 Shortcut 置灰,点击会提示 shortcutDisabledMessage。
    对于动态 Shortcuts 建议通过禁用的方式而不是直接删除的方式,因为已经删除的动态 Shortcut 如果被固定了依然是可用的,所以希望该入口不可用最好的方式是禁用。


http://chatgpt.dhexx.cn/article/ri9aMlMg.shtml

相关文章

oracle 左连接

oracle左连接小结 当使用左连接关联表进行查询时&#xff0c;如果右侧的表在关联的条件中有重复的数据&#xff0c;就会导致最后的查询结果比预期的多&#xff0c;比如&#xff1a; select * from A 需要关联的表 select * from B 这里的两个表的id都是主键&#xff0c;现在…

lambda多表左连接

下面是mysql多表左连接&#xff0c;对应的lambda表达式写法&#xff0c;只为快速解决你的问题&#xff0c;详细的就不介绍了&#xff0c;只出结果&#xff0c;相信稍微有点基础的都能看懂。相关知识点&#xff0c;请自行百度 关键字&#xff1a;GroupJoin、SelectMany sql语句…

实例讲解内连接、左连接、右连接、交叉连接、外连接以及全连接

目录 示例表&#xff1a;1.内连接-inner&#xff1a;实例1&#xff1a;内连接表a和表b实例2&#xff1a;内连接表a和表c实例3&#xff1a;内连接表a和表b,使用“>”号实例4&#xff1a;内连接表a和表b,使用“<”号实例5&#xff1a;内连接表a和表b,指定字段显示实例6&…

mysql 左连接查询记录数,MySQL左连接查询记录行数

最近修复一个数据问题&#xff0c;其中用到了左连接&#xff0c;我的意识里还以为A左连接B&#xff0c;查询出的记录数量会是A的记录数&#xff0c;然而实际操作后发现认知严重错。 网上关于左连接的一张图 摘自网上的一张图&#xff0c;图确实没毛病&#xff0c;但我却产生了误…

mysql左连接出现笛卡尔积_Mysql内连接、左连接会出现笛卡尔积的理解

先简单解释一下笛卡尔积。 现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4} 集合 AB 和 BA的结果集就可以分别表示为以下这种形式: AB = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}; BA = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)}; 以上AB和BA的结…

关于左右连接

首先来看一下两张主要的表&#xff1a; persons表 orders表 现在我们希望列出所有的人&#xff0c;以及他们的定购。 SELECTpersons.last_name,persons.first_name,orders.order_no FROMpersons LEFT JOIN orders ON persons.pid orders.pid ORDER BYpersons.last_nam…

LINQ左连接

title: linq左连接 date: 2021-12-05 08:45:48 tags: C# Linq LINQ语言继承查询 近日项目实践中遇到这样的一个事情。在一个项目需求里存在这么一个情况&#xff0c;有以下一个主表与几个基础数据表组成一个大表&#xff0c;要求主表中的有的数据必须展示出来&#xff0c;但大…

ClickHouse左连接

A左连接B>S1区域 1、等价方式一 SELECT date, ts, country, province, city,ye_no FROM (SELECT date, ts, country, province, city,0 AS yes_no FROM DBa.tba WHERE (date today()-1) ) ALL LEFT JOIN (SELECT date, ts, country, province, city FROM DBb.tbb WH…

【Mysql】图解左、右、内与全连接

一、前言 使用学生表与成绩表来演示Mysql中的各种连接查找 学生表的建表语句如下&#xff1a; CREATE TABLE student(id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增序号,st_id int(11) DEFAULT NULL COMMENT 学生id,st_name varchar(255) DEFAULT NULL COMMENT 学生姓名…

使用VC和MATCOM结合开发应用程序心得笔记

使用VC和MATCOM结合开发应用程序心得笔记1. 什么是Matcom?Matcom是MathTools公司(UPenn)开发的一个基于C矩阵函数库Matrix的一个matlab m文件与cpp文件的转换程序。MIDEVA为他的一个集成调试编译环境(界面)。Matcom独立于matlab之外&#xff0c;但需要外部的c编译器&…

MATLAB与VC混合编程(1)

在本节中先介绍matcom&#xff0c;使得VC能调用Matlab 的M文件&#xff0c;从而实现混合编程。 Matcom是mathTools公司推出的一个能将M文件转化成相同功能C代码的工具。相比Matlab自带的编译器Compiler&#xff0c;用Matcom转化代码要简单和方便得多。以VC6.0和Matcom为例&…

利用Matcom实现基于MATLAB的混合编程

利用Matcom实现基于MATLAB的混合编程 来源: 神经网络 作者&#xff1a;AI俱乐部 网友评论 0 条 浏览次数 42 <script> remark_look(re_look.php?cid17&tid1843); </script> Matcom是mathTools公司推出的最早的Matlab到C的编译器。后来&#xff0c;由于Mathto…

深度学习(十二):Matconvnet小试牛刀与提特征

该节简单介绍一下如何使用Matconvnet的现有的模型进行图像分类实验以及提取图像对应层的特征。 先来看看如何用训练好的imagenet网络模型进行图像的预测&#xff0c;英文版的官网教程就在这里&#xff1a; http://www.vlfeat.org/matconvnet/quick/ 检测图像分类之前&#x…

项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)

1、项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一。它合并两个图像, 即 内容图像 C&#xff08;content image&#xff09; 和 样式图像S&#xff08;style image&#xff09;, 以生成图像 G&#xff08;generated image&#xff09;。生成的图像 G 将图像 C 的 内…

Matconvnet学习笔记

Introduction to Matconvnet MatConvNet是实现用于计算机视觉领域的卷积神经网络(CNN)的MATLAB工具箱。自从取得突破性工作以来,CNN在计算机视觉领域有一个重大影响&#xff0c;特别是图像理解&#xff0c;基本上取代了传统图像表示。有许多其他机器学习、深度学习和CNN开源库的…

20190812_解决anaconda下install库的问题

20190812_解决anaconda下install库的问题 一、起因二、开始解决三、解决方法1 创建虚拟环境2 在环境中安装库3 重新配置pycharm中的解释器4 运行5 其他 一、起因 在学习PYQT5例子时&#xff0c;需要在anaconda下使用plotly库 二、开始解决 使用&#xff1a; conda install …

matlab已停止工作 win7 64,win7系统笔记本运行软件弹出“Matlab已停止工作”的解决方法...

很多小伙伴都遇到过win7系统笔记本运行软件弹出“Matlab已停止工作”的困惑吧&#xff0c;一些朋友看过网上零散的win7系统笔记本运行软件弹出“Matlab已停止工作”的处理方法&#xff0c;并没有完完全全明白win7系统笔记本运行软件弹出“Matlab已停止工作”是如何解决的&#…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历&#xff0c;但是从参加工作后&#xff0c;基本都是通过for循环遍历&#xff0c;没用过迭代器&#xff0c;于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意&#xff1a;这里只讲通过遍历同时能过获取key和value的遍…

java map集合如何遍历效率高 java中Map遍历的方式

java map集合如何遍历效率高 java中Map遍历的方式 一、前言 1、在看 《阿里巴巴java开发手册》时候&#xff0c;有一条推荐的规约&#xff1a; 【推荐】使用entrySet遍历Map类集合KV&#xff0c;而不是keySet方式进行遍历。 说明&#xff1a;keySet其实是遍历了2次&#xff0c…

【Java】Map遍历key-value的四种方法

Map遍历key-value的四种方法 &#xff08;1&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——增强for循环遍历 &#xff08;2&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——使用迭代器遍历 &#xff08;3&#xff09;通过entryS…