【详细】长按APP图标弹出快捷方式,ShortCut功能实现

Shortcuts介绍

Android7.1(API Level 25)及以上系统可以自定义Shortcuts,通过在桌面上长按App Icon弹出Shortcut列表,点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。国内各个厂商基本上在安卓8.0上集成了该功能。见下图

  

1.1 Shortcuts的简单作用

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

在地图类app中,指导用户到特定的位置;
在社交类app中,发送消息给一个朋友;
在媒体类app中,播放视频的下一片段;
在游戏类app中,下载最后保存的要点;
在实际开发中,我们具体想让哪些操作作为快捷方式,可自行定义。

1.2 静态实现

1. 在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>


2. 创建定义AppShortcuts的资源文件,res/xml/shortcuts.xml文件 

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/tools"><!-- 第一个静态shortcut --><shortcutandroid:shortcutId="static_one"android:enabled="true"android:icon="@mipmap/icon_diamond"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的回退栈,最后一个才是被快捷方式打开的那个。--><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.butterknifetest"android:targetClass="com.example.butterknifetest.MainActivity"/><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.butterknifetest"android:targetClass="com.example.butterknifetest.AndroidTestActivity"/><!--最后这个是要打开的intent,前边的intent表示点击返回时依次回退的intent。如果不设置回退intent,则按返回键会返回桌面。--><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.butterknifetest"android:targetClass="com.example.butterknifetest.TestActivit"/></shortcut><!-- 第二个静态shortcut --><shortcutandroid:shortcutId="static_two"android:enabled="true"android:icon="@mipmap/icon_star"android:shortcutLongLabel="@string/static_two_long_label"android:shortcutDisabledMessage="@string/static_disabled_message"android:shortcutShortLabel="@string/static_two_short_label"><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.butterknifetest"android:targetClass="com.example.butterknifetest.MainActivity"/><!--最后这个是要打开的intent,前边的intent表示点击返回时依次回退的intent。如果不设置回退intent,则按返回键会返回桌面。--><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.butterknifetest"android:targetClass="com.example.butterknifetest.TestActivity"/></shortcut></shortcuts>

<shortcut/> 标签内容只少要设置一个intent,即图标指向的intent。

如果有多个,最后一个是最终指向的intent,之前的则认为是打开后,点击返回键时依次回退的intent。


3. 属性讲解

以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.3 动态实现

        代码创建Dynamic shortcut,需要使用API ShortcutManager和ShortcutInfo.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;
--------------------- 
作者:HL是限量版 
来源:CSDN 
原文:https://blog.csdn.net/m0_37218227/article/details/84071043 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS实验教程——实验二十八:统计图表(饼状图、柱状图)制作

统计图表(饼状图、柱状图)预览: ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 1. 制作图表2. 在地图上显示图表1. 制作图表 加载甘肃行政区划数据。 打开数据的属性表,可以看到有面积、人口、GDP、土地利用等字段。

01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》

本机环境&#xff1a;win10 集成环境&#xff1a;studyphp&#xff08;方便学习使用Windows下集成环境&#xff09; 数据库可视化操作软件&#xff1a;sqlyog 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《…

一个Dapr的POC应用

开源了之前开发的一个Dapr的POC应用。地址在&#xff1a;https://github.com/heavenwing/daprapps-poc是以一个供应链的系统&#xff08;的一部分业务&#xff09;作为场景。POC场景很简单&#xff1a;管理部分基础数据实现简单的入库流程&#xff0c;包括申请-收货-入库整个架…

ArcGIS实验教程——实验二十九:ArcGIS制图掩膜工具案例详解

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 实验目录 1. ArcGIS掩膜概述2. 死胡同掩膜3. 要素轮廓线掩膜4. 交叉图层掩膜1. ArcGIS掩膜概述 掩膜是利用遮盖或隐藏要素的视觉处理技术来增强地图表现力的一种技术手段,掩膜实质是包含一些多边…

03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

使用开源工具 k8tz 优雅设置 Kubernetes Pod 时区

容器在主机的内核上运行&#xff0c;并获得时钟&#xff0c;但时区不是来自内核&#xff0c;而是来自用户空间。在大多数情况下&#xff0c;默认使用协调世界时 (UTC)。时区的不一致&#xff0c;会带来很多困扰。即使代码与时区无关&#xff0c;但容器日志与系统日志时间相关联…

04 tp6 的查数据 find、select、findOrEmpty、findOrFail、toArray、selectOrFail、value、column《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

学生信息管理系统小结

ASP.NETAccess 一、登入部分 主界面 Fm new 主界面(); string s1 "ProviderMicrosoft.Jet.OLEDB.4.0;Data Sourcestudent.mdb"; string s2 "select*from 登录信息表 where 用户名" this.ttbName.Text " and 密码 "…

05 tp6 的数据添加 助手函数、 save、insert、strict、replace、insertGetId、insertAll《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

VS2019如何创建C++项目?没有找到空项目(C++)完全解决方案

在使用Visual Studio 2019创建C++空项目时,没有空白项目可选,如下图所示,原因是在安装VS2019时没有选择C++对应的模块。本文讲解如何使用VS2019创建C++空项目,并使用C语言输出Hello World。 运行Visual Studio Installer,点击【修改】。 勾选【使用C++的桌面开发】,点击…

CentOS7.2 忘记root密码解决

CentOS 7 root密码的重置方式和CentOS 6完全不一样&#xff0c;以进入单用户模式修改root密码为例。 1.重启开机按esc&#xff0c;在第一行按e&#xff0c;进行编辑 2.编辑修改两处&#xff1a;ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh 3.按CtrlX重启&#xff0c;并修改…

android:制作 Nine-Patch 图片

它是一种被特殊处理过的 png 图片&#xff0c;能够指定哪些区域可以被拉伸而 哪些区域不可以。 那么 Nine-Patch 图片到底有什么实际作用呢&#xff1f;我们还是通过一个例子来看一下吧。比如 说项目中有一张气泡样式的图片 message_left.png&#xff0c;如图 3.38 所示。 图 …

08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》

知识点&#xff1a;获取器 withAttr、多连缀、whereRaw、事务、数据集 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商…

Chrome 双击关闭标签,新窗口打开新地址,一个插件搞定,安装方便,自带hosts

对&#xff0c;没错&#xff0c;就这它&#xff1a; 下载地址&#xff1a;https://shuax.com/project/greenchrome/ 一、插件安装 下载后&#xff0c;将下载的压缩包解压&#xff0c;根据自己Chreom浏览器是32位还是64位找到对应的 winmm.dll 文件&#xff0c;复制到Chome安装…

C#中的闭包和意想不到的坑

虽然闭包主要是函数式编程的玩意儿&#xff0c;而C#的最主要特征是面向对象&#xff0c;但是利用委托或lambda表达式&#xff0c;C#也可以写出具有函数式编程风味的代码。同样的&#xff0c;使用委托或者lambda表达式&#xff0c;也可以在C#中使用闭包。根据WIKI的定义&#xf…

投票彰显电信合约机诺基亚Lumia 800C受热捧

49元可以做什么&#xff1f;与朋友吃顿便饭、买几包好烟&#xff0c;同时也能参加中国电信Lumia 800C的合约购机计划&#xff0c;其中选择49元是最低套餐&#xff0c;选择并预存600元话费&#xff0c;便可以以2999元购买Lumia 800C。 对于Lumia 800C&#xff0c;它可是新一代诺…

07查询表达式 及 page分页、order 排序《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

基于netty的微服务架构

基于netty的微服务架构 微服务一篇好文章 http://san-yun.iteye.com/blog/1693759 教程 http://udn.yyuap.com/doc/essential-netty-in-action/GETTING%20STARTED/Introducing%20Netty.html netty原理 http://www.infoq.com/cn/articles/netty-server-create netty方面专家 李林…

无人机模拟操控凤凰模拟器(PhoenixRC 5.0)安装及配置图文教程(附凤凰模拟器下载地址)

文章目录 1. 凤凰模拟器简介2. 凤凰模拟器安装及配置图文教程3. 凤凰模拟器下载地址1. 凤凰模拟器简介 凤凰phoenixrc模拟器(航模8合1模拟器)是一款专业的飞行模拟器软件,它是属于航模新手练模拟专用,可模拟大疆无人机,各种穿越机,还有很多固定翼和直升机等等。凤凰模拟操…

NCF 的Dapr应用实例的运行

简介在进行今天的主要内容之前&#xff0c;先带大家了解一下DaprDapr 是一个可移植的、事件驱动的运行时&#xff0c;它使任何开发人员都可以轻松构建在云和边缘上运行的弹性、无状态和有状态的应用程序&#xff0c;并包含语言和开发人员框架的多样性。任何语言&#xff0c;任何…