元数据不单单能传递简单的字符串参数,还能传送更复杂的资源数据,从Android7.1开始新增的快捷方式便用到了这点,譬如在手机上桌面长按支付宝图标,会弹出如下图所示的菜单。


点击菜单项“扫一扫”,直接打开支付宝的扫码页面;点击菜单项“付钱”,直接打开支付宝的付款页面;点击菜单项“收钱”,直接打开支付宝的收款页面。如此不必打开支付宝首页,即可迅速跳转到常用的App页面,这便是所谓的快捷方式。
那么Android7.1又是如何实现快捷方式的呢?那得再琢磨琢磨元数据了。原来元数据的meta-data标签除了前面说到的name属性和value属性,还拥有resource属性,该属性可指定一个XML文件,表示元数据想要的复杂信息保存于XML数据之中。借助元数据以及指定的XML配置,方可完成快捷方式功能,具体的实现过程介绍如下:
首先打开res/values目录下的strings.xml,在resources节点内部添加下述的三组(每组两个,共六个)字符串配置,每组都代表一个菜单项,每组又分为长名称和短名称,平时优先展示长名称,当长名称放不下时才展示短名称。这三组字符串的配置定义示例如下:

    <string name="first_short">first</string><string name="first_long">扫一扫</string><string name="second_short">second</string><string name="second_long">付钱</string><string name="third_short">third</string><string name="third_long">收钱</string>

接着在res目录下创建名叫xml的文件夹,并在该文件夹创建shortcuts.xml,这个xml文件用来保存三组菜单项的快捷方式定义,文件内容如下所示:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid:shortcutId="first"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/first_short"android:shortcutLongLabel="@string/first_long"><!-- targetClass指定了点击该项菜单后要打开哪个活动页面 --><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example.test"android:targetClass="com.example.test.ScanActivity" /><categories android:name="android.shortcut.conversation"/></shortcut><shortcutandroid:shortcutId="second"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/second_short"android:shortcutLongLabel="@string/second_long"><!-- targetClass指定了点击该项菜单后要打开哪个活动页面 --><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example.test"android:targetClass="com.example.test.PayActivity" /><categories android:name="android.shortcut.conversation"/></shortcut><shortcutandroid:shortcutId="third"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/third_short"android:shortcutLongLabel="@string/third_long"><!-- targetClass指定了点击该项菜单后要打开哪个活动页面 --><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example.test"android:targetClass="com.example.test.ReceiActivity" /><categories android:name="android.shortcut.conversation"/></shortcut>
</shortcuts>

由上面的xml例子看到,每个shortcut节点都代表了一个菜单项,该节点的各属性说明如下:
shortcutId:快捷方式的编号。
enabled:是否启用快捷方式。true表示启用,false表示禁用。
icon:快捷菜单左侧的图标。
shortcutShortLabel:快捷菜单的短标签。
shortcutLongLabel:快捷菜单的长标签。优先展示长标签的文本,长标签放不下时才展示短标签的文本。
以上的节点属性仅仅指明了每项菜单的基本规格,点击菜单项之后的跳转动作还要由shortcut内部的intent节点定义,该节点主要有targetPackage与targetClass两个属性需要修改,其中targetPackage属性固定为当前App的包名,而targetClass属性描述了菜单项跳转页面类的完整路径。
然后打开AndroidManifest.xml,找到MainActivity所在的activity节点,在该节点内部补充如下的元数据配置,其中name属性为android.app.shortcuts,而resource属性为@xml/shortcuts:

        <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />

这行元数据的作用,是告诉App首页有个快捷方式菜单,其资源内容参见位于xml目录下的shortcuts.xml。完整的activity节点配置示例如下:

    <activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- 指定快捷方式。在桌面上长按应用图标,就会弹出@xml/shortcuts所描述的快捷菜单 --><meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /></activity>

然后把测试应用安装到手机上,回到桌面长按应用图标,此时图标下方弹出下图所示的快捷菜单。


点击其中一个菜单项,果然跳到了配置的活动页面,证明元数据成功实现了类似支付宝的快捷方式。

点此查看Android开发笔记的完整目录

Android开发笔记(一百七十)给App的应用页面注册快捷方式相关推荐

  1. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  2. Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...

  3. Android开发笔记(七十四)布局文件优化

    include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...

  4. Android开发笔记(七十八)异常容错处理

    Exception Java的异常分两类,运行时异常RuntimeException和非运行时异常. 运行时异常包括空指针异常NullPointerException.数组越界异常IndexOutOf ...

  5. Android开发笔记(七十)反编译初步

    查看平台源码 查看内核源码 Android的内核源码很大,有几个G,仔细找找网上有许多下载的地方.作为普通开发者,一般不需要阅读内核源码,但一点都不了解好像也不行,因为实际开发中有时候就得会那么一点点 ...

  6. Android开发笔记(七十二)数据加密算法

    编码算法 URL编码 URL编码其实并非加解密算法,只是对特殊字符进行字符转义,从而方便在URL中传输参数.URL编码有两种方式,一种是狭义的URL编码,另一种是广义的URL编码. 狭义的URL编码指 ...

  7. Android开发笔记(八十)运行状态检查

    大家都知道刻舟求剑的寓言故事,说的是事物是发展变化着的,如果拘泥于原来的情况,那随着情况的改变,就不会得到预期的结果.同样,影响app运行的因素,并不只是外部环境(如硬件.系统.权限等等),还包括ap ...

  8. Android开发笔记(七十七)图片缓存算法

    ImageCache 由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存.图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了.只要理解图片缓存的算法, ...

  9. Android开发笔记(七十三)代码混淆与反破解

    代码混淆 ProGuard是ADT自带的apk混淆器,它的用途有: 1.压缩apk包的大小,能删除无用的代码,并简化部分类名和方法名. 2.加大破解源码的难度,因为部分类名和方法名被重命名,使得程序逻 ...

  10. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

最新文章

  1. 数据挖掘 概念与技术(原书第3版)
  2. comparable接口和comparator接口的作用和区别?_接口和抽象类有什么联系和区别?
  3. 2015计算机应用基础平时作业答案,2015秋《计算机应用基础》第一次作业
  4. 计算机网络--接入互联网方式
  5. 调查显示:被黑过的公司难以找到投资
  6. postfix 过滤中文内容
  7. Android应用内嵌cocos2dx游戏项目
  8. Linux 命令(29)—— ls 命令
  9. XP中轻松获取未使用的IP地址
  10. 创建二叉排序树,二叉树的六种遍历
  11. 强大的支持多文件上传的jQuery文件上传插件Uploadify
  12. c语言csp字符串,骇人听闻的 CSP
  13. sql2000安装失败的解决方法
  14. 纯css三层侧边栏效果
  15. 微信公众号开发--js关闭浏览器回到公众号对话窗口
  16. 对于人工智能的认识,我们需要更深入全面的理解
  17. 第四章:Android灯光系统(5)-通知灯
  18. ol中闪烁点动画的实现
  19. 做股指期货投资必看的32本书
  20. CSS 属性 cursor 手势设置(琐碎知识点整理)

热门文章

  1. Leetcode每日一题:面试题16.19.水域大小
  2. 蓝桥杯 基础练习 字母图形
  3. 《Deep Learning》笔记
  4. 传统IT正在被颠覆,下一个风口会是互联网+吗?
  5. 忘记commit也会造成select查询的性能问题
  6. osg+ActiveQT嵌入ie64位
  7. css设计引言,HTML5与CSS3设计模式 引言(3)
  8. c语言宏定义技巧和用法,关于C语言宏定义的技巧:'#'和'##'
  9. ModuleNotFoundError: No module named ‘win32ui‘
  10. MyBlog前端开发2