1.什么是IntentFilter ?

IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。

例如:当用户点击PDF文件的时候,Android系统就会通过设定好的意图过滤器,进行匹配测试。找到能够打开PDF文件的APP程序。

代码:

 <activity android:name="com.example.testmain.ShowActivity" ><intent-filter><action android:name="test.update.mydata" /><category android:name="my.test.show" /><data android:pathPattern=".*\\.jpg" android:scheme="http" /></intent-filter></activity>

2.IntentFilter 如何过滤隐式意图?

Android系统会根据我们配置的Intent Filter(意图过滤器),来进行匹配测试。匹配的时候,只会考虑三个方面:动作、数据(URI以及数据类型)和类别。也就是说Android系统会进行“动作测试”,“数据测试”,“类别测试”,来寻找可以响应隐式意图的组件或服务。

另外,当对其他App程序开放组件和服务的时候也需要配置Intent Filter(意图过滤器),一个Activity可以配置多个<intent-filter>。

3.动作测试:

对应<intent-filter>中的<action/>标签;

(1) 如果<intent-filter>标签中有多个<action/>,那么Intent请求的Action,只要匹配其中的一条<action/>就可以通过了这条<intent-filter>的动作测试。
(2) 如果<intent-filter>中没有包含任何<action/>,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
(2) 如果Intent请求中没有设定Action(动作),那么这个Intent请求就将顺利地通过<intent-filter>的动作测试(前提是<intent-filter>中必须包含有<action/>,否则与第二条冲突)。
4.类别测试:

对应<intent-filter>中的<category />标签;

(1)Intent中的类别必须全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />将不会导致匹配失败。

例如:Intent中有3个类别,而意图过滤器中定义了5个,如果Intent中的3个类别都与过滤器中的匹配,那么过滤器中的另外2个,将不会导致类别测试失败。

注意:有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

5.数据测试:

对应<intent-filter>中的<data>标签;

<data>元素指定了可以接受的Intent传过来的数据URI和数据类型,当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。

例如:

如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。

当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

比较规则如下:

(1) 一个既不包含URI也不包含数据类型的意图对象,仅在过滤器也同样没有指定任何URI和数据类型的情况下才能通过测试。

(2)一个包含URI但没有数据类型的意图对象,仅在它的URI和一个同样没有指定数据类型的,过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

(3)一个包含数据类型但不包含URI的意图对象,仅在这个过滤器列举了同样的数据类型,而且也没有指定一个URI的情况下才能通过测试。

(4)一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容

content:或者文件file: URI,而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持 ”content: 数据“ 和 “file: 数据”,如果它的过滤器仅列举了一个数据类型。

例如AndroidManifest.xml中有:

<intent-filter><action android:name="com.nanlove.wangshiming"/><action android:name="wangshiming"/><category android:name="android.intent.category.DEFAULT" /><category android:name="wangshiming.intent.category"/><data android:scheme="love" android:host="hao123.com"       android:port="888" android:path="/MM" android:mimeType="text/plain"/>
</intent-filter>

对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了

intent.setAction("com.nanlove.wangshiming");//中的action也可以为wangshiming

intent.addCategory("wangshiming.intent.category")代码中的addCategory并不用写因为android他有默认的category 只要配置清单中存在<category android:name="android.intent.category.DEFAULT" />就可以了.

没有  "数据参数" 的情况下只要意图对象中的设置动作和类别都出现在intent-filter就能跟filter匹配,但是有数据<data android:scheme="love" android:host="hao123.com"  android:port="888" android:path="/MM" />数据项一定要完全匹配。

当数据和数据类型 android:mimeType="text/plain"同时存在的时候,不能使用intent.setData(Uri.parse("love://hao123.com:888/MM")) ;

因为setData的方法会自动清除前面的数据类型:This method automatically clears any type that was previously set by setType;

所以后面的setType就无法匹配,应该使用intent.setDataAndType(Uri.parse("love://hao123.com:888/MM"), "text/plain");

提示:在同一个应用内,能使用显示意图,就尽量使用显示意图,增加程序的效率,理论上隐式意图匹配规则是需要花时间寻找的。

参考地址:http://blog.csdn.net/zidan_2011/article/details/7433776

IntentFilter简述相关推荐

  1. IntentFilter

    当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些Intent,那么就需要用到IntentFilter对象. 顾名思义,IntentFilter对象负责过滤掉组件无法 ...

  2. IntentFilter(意图过滤器)

    转自https://blog.csdn.net/today520/article/details/7000048 当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些I ...

  3. Android BLE开发 百度地图 大神博客简书传送门合集

    一.踩坑 踩坑1: 问题Q:方法报错.标红.Android Studio提示必须添加权限检查. 解决S:不用管,一样能够正常运行! 踩坑2: 问题Q:权限报错.标红.提示必须是系统应用才可以使用. 解 ...

  4. 简述 IntentFilter(意图过滤器)

    1.什么是IntentFilter ? IntentFilter翻译成中文就是"意图过滤器",主要用来过滤隐式意图.当用户进行一项操作的时候,Android系统会根据配置的 &qu ...

  5. Activity简述

    Activity 简述   Android 开发的四大组件分别是:活动(activity),用于表现功能:服务(service),后台运行服务,不提供界面呈现:广播接受者(Broadcast Rece ...

  6. 简述计算机科学的核心内容,北京大学-计算机科学与技术(2018秋)作业及复习

    59.(第十章)外排序是指在排序前后,数据在外存上,排序时数据调入内存进行的排序方法. 60.(第十章)在选择排序.冒泡排序.归并排序中, 归并排序是空间复杂度最大的. 三.简答和程序题(共10题,每 ...

  7. android service intent-filter,如何在permission中加入intent-filter过滤器获取NotificationListenerService权限...

    现在要让我的app获取NotificationListenerService权限,我勾选了BIND_NOTIFICATION_LISTENER_SERVICE权限后,用native.js跳到ACTIO ...

  8. 设计模式学习1:设计模式简述和设计模式原则

    设计模式简述 什么是设计模式? 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 设计模式的目的: 代码高可用(相同作用的代码能重复 ...

  9. Java中常见的锁简述

    在Java的应用中,或多或少的都会接触到一些锁,那么问题就来了,在Java中,常见的锁有哪些,都有什么样的作用?? 这里给大家简单的简述一下这些学常见的锁. 本文件所涉及到的锁: 1.公平锁 / 非公 ...

最新文章

  1. 利用ACS实现AAA认证
  2. JBoss 类加载器问题解决
  3. C语言中,带空格的字符串输入
  4. STM32的FLASH ID加密
  5. CentOS 7 安装nginx
  6. Linux Vi常用技巧
  7. cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽
  8. 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划
  9. Struts2 + MySQL 实现分页
  10. 使用ODBC向SQLServer存储过程传参数的方法
  11. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)
  12. android jni java call c字符串乱码,JNI系列入门之C语言中文字符串乱码问题
  13. 贝叶斯决策matlab模拟
  14. 怎么使用计算机唱歌,声卡怎么用手机唱歌
  15. 断电oracle 01033,电脑非法关机 导致ORA-01033:解决方法
  16. Netty常用招式——ChannelHandler与编解码
  17. AAAI 2020使用深度强化学习的MOBA游戏《Towards Playing Full MOBA Games with Deep Reinforcement Learning》打败王者荣耀顶尖选手
  18. 找不到启动设备按任意键重新启动计算机,[已解决]硬盘3f0 /找不到启动设备错误...
  19. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(SPI flash)
  20. 最喜欢的科技资讯类英文网站

热门文章

  1. 使用realsensed455修改分辨率问题
  2. vue3使用的移动端UI框架,vue一般用什么ui框架
  3. 索引,主键,唯一索引,联合索引 的区别
  4. 西门子s7-100模拟器仿真软件下载
  5. 微商成功神器,python程序员教你,一键分析微信好友近期所有信息
  6. 智慧管廊综合管理系统的搭建
  7. 怎么清理IE浏览器缓存
  8. EDA硬件描述语言VHDL(一)
  9. 德国网站评选100个最佳字体
  10. 2023年上半年网络工程师下午真题及答案解析