Activity的IntentFilter匹配规则

2023-11-18

@读书笔记

  我们知道,启动Activity分为两种方式,显示调用和隐式调用。显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity. IntentFilter中的过滤信息有
- action
- category
- data

过滤规则的示例如下:

  <activity android:name="com.simon.activity.SecondActivity"
         android:launchMode="singleTask"
         >
            <intent-filter>
                <action android:name="com.simon.activity1"/>
                <action android:name="com.simon.activity2"/>
                <category android:name="com.simon.activity3"/>
                <category android:name="com.simon.activity4"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="text/plain"/>
       </intent-filter>
    </activity>

为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息否则匹配失败。 一个过滤列表中的action,category和data可以有多个,所有的action,category,data分别构成不同类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action类别,category类别,data类别才算完全匹配。只有完全匹配才能成功启动目标activity。另外一点,一个activity中可以有多个intent_filter. 一个Intent只要能够匹配任何一组intent-filter即可成启动对应的Activity.

1.action的匹配规则:
action是一个字符串,系统预定了一些action,同时我们也可以在应用中定义自己的action. action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,这里说的匹配是指action的字符串的值完全一样。一个过滤规则可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。 针对上面的过滤规则,只要我们的Intent中的action值为”com.simon.activity1”或“com.simon.activity2”都能成功匹配。 需要注意的是,Intent中如果没有指定action,那么匹配失败。
总结一下:
action匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同,这里需要注意它和category匹配规的不同。另外,action区分大小写,大小不同,字符相同会匹配失败。

2.category的匹配规则:
category是一个字符串,系统预定了一些category,同时我们也可以在应用中定义自己的category. category的匹配规则和Action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。换句话说,Intent中如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中已定义的category。 当然Intent中可以没有category,如果没有category的话,按照上面的描述,这个Intent仍然可以匹配成功。 这里要注意下它和action匹配过程的不同,action是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求Intent可以没有category,但是如果有cageroy,不管有几个,每个都要能够和过滤规则中的任何一个category相同。为了匹配前面过滤规则中的category, 我们可以在Intent中添加 intent.addcategory(“com.simon.activity3”)或者 intent.addcategory(“com.simon.activity4”)亦或者不设置category.为什么不设置category也可以匹配呢? 原因是系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category.同时,为了我们的activity能够接受隐式调用,就必须在Intent-filter中指定“android.intent.category.DEFAULT”这个category.

3.data的匹配规则:
data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data.

先看一下 data的结构:

  <data 
            android:scheme="string"
            android:host="string"
            android:port="string"
            android:path="string"
            android:pathPattern="string"
            android:pathPrefix="string"
            android:mimeType="string"
            />

data由两部分组成,mimeType和URI。mineType指媒体类型,比如image/jpeg, audio/mepeg4-generic 和 video/*等。可以表示图片,文本,视频等不同的媒体格式,而URI中包含的数据就比较多了。下面是URI的结构:

<scheme>://<host>:<port>/[path]|[pathPrefix]|[pathPattern]

实例:

content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
  • Schema: URI的模式,比如http,file,content等,如果URI中没有指定scheme,那么整个URI的参数无效。这也意味着URI无效。
  • Host:URI的主机名,比方www.baidu.com,如果host未指定,那么整个URI中的其他参数无效,这也意味着URI是无效的。
  • Port: URI中的端口号,比如80,仅当URI中指定了scheme和host参数的是port参数才是有意义的。

path,pathPattern和pathPrefix:这三个参数表述路径信息,其中path表示完整的路径信息,但是它里面可以包含通配符“ * ”,“ * ”表示0个或者多个任意字符,需要注意的是,由于正则表达式的规范,如果想表示真实的字符串,那么“ * ”要写成“ \* ”,“\”要写成“\\”; pathPrefix表示路径的前缀信息。

介绍完data的数据格式后,来看一下data的匹配规则。 data的匹配规则和action类似,它也要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data,这里的完全匹配是指完全匹配是指过滤规则中出现的data部分也出现在了Intent中的data中。

如下面这个过滤规则:

 <intent-filter>
                <data android:mimeType="image/*"/>
  </intent-filter>

这种规则中指定了媒体类型为所有类型的图片,那么Intent中的mimeType属性必须为“image/* ”才能匹配,这种情况下虽然过滤规则没有指定URI,但是却有默认值,URI的默认值为content和file。也就是说,虽然没有指定URI, 但是Intent中的URI部分的scheme必须为content或者file才能匹配。
例如为了匹配上面的这个规则:我们可以写出如下代码:

intent.setDataAndType(Uri.parse("file://abc)"),"image/png");

另外,如果要为Intent指定完整的data,必须要调用setDataAndType方法,不能调用setData再调用setType。

再例如下面这个过滤规则:

 <intent-filter>
                <data android:mimeType="video/mpeg"  android:scheme="http"/>
                <data android:mimeType="audio/mpeg"  android:scheme="http"/>
    </intent-filter>

这个filter指定了两组data数据,且每个data都指定了完整的属性值,既有URI又有mimeType.为了匹配上面的这个规则,我们可以写出如下代码去匹配:

 intent.setDataAndType(Uri.parse("http://abc)"),"video/mpeg");
或者               intent.setDataAndType(Uri.parse("http://abc)"),"audio/mpeg");

到这里,我们写开始的那个intentFilter的匹配规则,就很简单了:
如下:

      intent.setAction("com.simon.activity1");
      intent.addCategory("com.simon.activity3");
  intent.setDataAndType(Uri.parse("content://abc)"),"text/plain");

隐式启动应用的时候,判断是否存在能够匹配的Activity
需要注意的是,我们使用隐式启动Activity的时候,需要先判断是否有能够匹配的Activity存在,如果不判断就直接调用的话,如果没有能够匹配的activity就会报错!

android.content.ActivityNotFoundException:NoActivity found to handle Intent

判断的方式有两种:
1.采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果它们找不到匹配的Activity就会返回null, 我们通过判断返回值就可以规避上述错误了。另外,PackageManager还提供了queryIntentActivities方法,这个方法和resolveActivity方法不同的是:它不是返回最佳匹配的Activity而是返回所有成功匹配的Activity信息。我们看一下queryIntentActivities和resolveActivity的方法原型:

public abstract ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags);

public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
            @ResolveInfoFlags int flags);

第一个方法的参数是需要启动的Intent,第二个参数我们需要使用MATCH_DEFAULT_ONLY这个标记位,这个标记位的含义是仅仅匹配那些在Intent-filter中声明了

<category android:name="android.intent.category.DEFAULT"/>

这个category的activity.使用这个标记位的意义在于,只要上述两个方法不返回null,那么startActivity一定可以成功。如果不用这个标记位,就可以把intent-filter中的category不含DEDFAUlT的那些Activity也匹配出来,从而导致startActivity可能失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Activity的IntentFilter匹配规则 的相关文章

  • 6.1 PyTorch简单二分类模型

    欢迎订阅本专栏 PyTorch深度学习实践 订阅地址 https blog csdn net sinat 33761963 category 9720080 html 第二章 认识Tensor的类型 创建 存储 api等 打好Tensor的
  • 从源码的角度回答“mybatis的#{} 和${}有什么区别”?

    java程序员面试的时候 碰上面试官问 mybatis 的 和 有什么区别 大概率你会这样回答 1 是预编译处理 是字符串替换 2 MyBatis在处理 时 会将sql中的 替换为 号 调用PreparedStatement的set方法来赋
  • 2min搞定 mac pycharm新建&导入python项目

    mac pycharm新建和导入python项目 虚拟环境配置 下载类库 一 通用设置 step1 通过自定义配置 指定默认虚拟环境变量 step2 设置虚拟环境和指定默认工作空间 step3 导入或者新建python项目 二 pychar
  • 杰里之蓝牙耳机距离及 天线匹配 调试方法篇

    一 t PCB layout 注意事项 1 1 保证 信号完整性 芯片 VMCU VDDIO BTAVDD RTCVDD 退偶电容地线回路要尽量短 SW BTAVDD 回路尽量短 地线完整 电 源线要尽量粗 一般 0 3MM 以上 请参考例
  • R语言与机器学习中的回归方法学习笔记

    来源 http blog sina com cn s blog 62b37bfe0101hom5 html key word lars rpart randomForest cp svm data diabetes prune boosti
  • BES系列蓝牙开发总结

    博文索引 框架 BES2300X BES2500X 框架解析 一 UI及外围功能模块 BES2300X BES2500X UI 按键 提示音 指示灯 BES2300X BES2500X UI 电池管理模块 蓝牙操作及协议连接 数据流及数据编
  • 使用jq实现手机上的touchmove效果

    Touch事件简介 pc上的web页面鼠 标会产生onmousedown onmouseup onmouseout onmouseover onmousemove的事件 但是在移动终端如 iphone ipod Touch ipad上的we
  • python pycharts模块词云

    from pyecharts import WordCloud import pandas as pd 读取文件 data pd read csv word csv names word count sep data data groupb
  • Java连接Mysql数据库详细代码

    数据库连接类 package util import java sql TODO author date 2020 12 10 9 07 public class DBUtil private final static String DRI
  • n个学生围成圈,报到3的学生被淘汰,最后剩下的学生编号是几号?

    include
  • Python的数据类型——字典(dict)

    目录 1 Python的数据类型 2 什么是字典 3 字典存储的数据 4 字典的语法 5 新建字典 1 用 新建一个空字典 2 新建一个存储城
  • list转json字符串

    使用Gson把list转成json字符串 com google gson Gson GetMapping valueTest public String valueTest List
  • 2021-08-03PHP面试笔试题记录

    1 一张表中有id pid name三个字段 用来表示无限级联动 pid表示父级id 如无父级 则pid为0 现已将表中数据全部查出 请封装函数 实现将该数据转换成树状结构 原始数据 menu datas id gt 1 pid gt 0
  • RGB三原色的简单理解

    RGB是什么 RGB是一种颜色表示系统 它由国际照明委员会 EIC 定义 选择红色 波长 700 00nm 绿色 波长 546 1nm 蓝色 波长 438 8nm 三种单色光作为表色系统的三基色 其中R red G Green B Blue
  • SpringSecurity学习笔记(七)密码加密

    参考视频 编程不良人 为什么要进行密码加密 如果密码直接存储到数据库不进行加密 一旦被黑客攻破就会导致用户的密码泄露 而且一般用户的密码是多个网站或者app用的同一个 这就导致了很大的安全隐患 所以一般数据库都不会直接存储用户的明文密码 都
  • java类型转换小细节之BigDecimal转String

    public static void main String args 浮点数的打印 System out println new BigDecimal 10000000000 toString 普通的数字字符串 System out pr
  • linux配置虚拟IP地址方法

    linux配置虚拟IP地址方法 在日常linux管理工作中 需要为应用配置单独的IP地址 以达到主机与应用的分离 在应用切换与迁移过程中可以做到动态切换 特别是在使用HA的时候 这种方案可以保证主机与应用的隔离 对日常的运维有很大的益处 但

随机推荐

  • DDL与DML的区别

    DML Data Manipulation Language 数据操纵语言 适用范围 对数据库中的数据进行一些简单操作 如insert delete update select等 DDL Data Definition Language 数
  • 如何排查 Electron V8 引发的内存 OOM 问题

    经过长达大半年时间的崩溃治理后 基于 Electron 框架开发的新版 PC 淘宝直播推流客户端的稳定性终于赶超基于QT 框架开发的旧版本了 剩下的崩溃问题中有 40 是跟内存 OOM 有关 其中 V8FatalErrorCallback
  • 堆栈常量池

    堆栈常量池详解 例子 转自 http www iteye com topic 634530 一 概述 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放
  • 在myeclipse拷贝项目时候经常遇到的问题

    我们有事为了省事 在myeclipse中拷贝一个web项目 然后复制下来 改改里面的内容就直接放到tomcat中运行 会发现找不到路径 然而地址栏什么的都正确 这是为什么那 仔细找找你会发现原来是 这个项目的入口没有改 你用的还是上一个项目
  • m3u8视频下载器

    文章目录 前言 一 获取网站的m3u8文件url 二 使用步骤 1 修改配置文件 2 运行py或者exe 总结 前言 有的时候看个视频太卡了 就想把视频搞下来 一些网站吧 它不让下载 而且还是ts流视频 于是就做了个m3u8视频下载器第一版
  • SQL如何分析用户复购?(复购率、表连接)

    题目 表名为 购买记录表 里记录某在线教育平台的用户购买记录 包含字段 用户id 购买时间 课程类型 消费金额 问题 分析出每日首次购买用户的次月 第三月 第四月复购情况如何 解题思路 1 群组分析方法 这类复购问题的取数方式是群组分析方法
  • GAMES101:作业3

    GAMES101 作业3 附其他所有作业超链接如下 Games101 作业0 作业0 Games101 作业1 作业1 Games101 作业2 作业2 Games101 作业3 作业3 Games101 作业4 作业4 Games101
  • python课程预告_2月27日直播课程预告

    明天硬核直播课程的预告 1 10 00 赖晓铮老师的 零代码FPGA图形化编程十日谈 明天讲时序逻辑电路的重要组成部分 计数器 本节需要熟悉基于触发器和组合逻辑的计数器电路模型 还会讲到秒表 电子钟和按键消抖电路的计数器应用示例 以及基于计
  • VS2017卡在登录界面问题

    文章目录 前言 分析 总结 参考链接 前言 之前一直在用VS2017来进行C 开发工作 今天打开软件 提示需要登录才能继续使用 但是在登录时 发现一直卡在登录界面 无法继续 如下图 分析 这里感觉是微软服务器连接不上导致的 所以在网上搜索了
  • 搭建MariaDB Gelera Cluster数据库集群

    基础准备 node1 node2 node3 yum源 三节点 安装并初始化数据库 三节点 配置数据库文件 三节点 node2 3 登录数据库 并赋予root用户远程权限后关闭数据库 三节点 启动数据库集群 验证集群功能 查看到wsrep
  • 适合男生的6个副业项目

    现在社会越来越激烈 大家都想在工作之余挣点外快 甚至实现财务自由 本文就为你们介绍几种适合男生从事的副业项目 1 成为自媒体达人 自媒体运营就是你在社交网络 博客 视频平台等自由发挥创作才华 发布内容 并从中赚钱的副业方式 随着智能手机和网
  • 以太坊geth客户端安装经历,也是艰难的一笔。

    现在开始通过看B站的视频学习以太坊 作为入门你看完基本理论肯定是要自己安装geth客户端的 可我缺出现了一些问题 首先我是liunx系统 通过putty软件连接的阿里云 在上面经行一些基本操作 对liunx指令一窍不通的我也是开始liunx
  • Spark项目实战-集群SSH免密码登录

    首先我们会根据之前的CentOS安装教程再搭建sparkproject2和sparkproject3两台虚拟机机器 然后在这基础上配置三台机器之间的ssh免密码登录 1 在三台机器的 etc hosts文件中 都配置对三台机器的ip hos
  • .NET 页面间传值的几种方法

    1 QueryString 这是最简单的传值方式 但缺点是传的值会显示在浏览器的地址栏中且不能传递对象 只适用于传递简单的且安全性要求不高的数值 传递 location href WebForm2 aspx name yourName 接收
  • 刷脸支付就是个破局的大杀器

    科技推动创新 改变产业链格局 从二维码支付爆发取代刷银行卡支付后 传统银行一直担忧的金融脱媒挑战实际上已是即成现实 尽管从监管层面上 一系列如 断直联 二维码互通 等监管要求 对金融机构有较大利好 但在二维码支付时代 大局已定 缺乏C端运营
  • 腾讯文件和微云服务器,网盘Web客户端对比:腾讯微云支持32GB单文件上传

    网盘Web客户端对比 腾讯微云支持32GB单文件上传 网盘最基本的客户端就是Web客户端 为了让这个最基本的客户端更好用 除了网易网盘以及新浪微盘外 其余几款网盘都有提供浏览器插件的下载 这些插件主要提供三个重要的功能 分别是大文件上传 断
  • matlab GUI窗口最大化,以及控件大小和字体自适应

    1 GUI 窗口最大化 双击除控件外的空白处 视图 属性检查器 resize on即可 设置完这个 当放大的时候 会发现我们控件的位置没有变化 此时我们需要设置一个 工具 GUI选项 调整大小的方式 成比例 2 控件大小和字体自适应 当我们
  • pytorch学习:loss为什么要加item()

    作者 陈诚 链接 https www zhihu com question 67209417 answer 344752405 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 PyTorch 0 4 0版本去
  • C#各种结束进程的方法详细介绍

    转自http www cnblogs com zjoch p 3654940 html Process类的CloseMainWindow Kill Close Process CloseMainWindow是GUI程序的最友好结束方式 从名
  • Activity的IntentFilter匹配规则

    读书笔记 我们知道 启动Activity分为两种方式 显示调用和隐式调用 显示调用需要明确的指定被启动对象的组件信息 包括包名和类名 而隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息 如果不匹配将无法启