3.1.0 Intent filter基本概念

前面章节我们说到了Intent,Intent对象中除了ComponentName可以直接指定目标组件外,其它的属性都无法直接指定目标组件。当然我们这里不指使用Activity的内部方法如startActivity或者intent的setClass方法可以指定目标组件。单独的属性是无法确定目标组件的。那Android怎么办呢?Android如何根据一个intent对象找到目标组件呢?Intent在系统中,从概念上分为显示intent和隐式intent。其中显示intent,就是前面所说的通过指定intent的目标组件名称来实现,这种intent需要知道目标组件名称。另一种所谓隐式intent,这种intent用intent filter进行处理。Android对每个组件设置intent filter来订阅intent 消息属性。这个有点类似于Linux IPC消息,发送者将消息发到Kernel,然后由组件通过intent filter从Kernel上取得消息。

显示intent和隐式intent在具体应用中,通常是针对不同的场景来进行应用,如显示intent通常是在一个应用的内部组件之间,这样可以知道具体目标组件的类名。而隐式intent就不一定了,通常可以打开如电话、短信等基础Android应用。前面我们说intent filter是针对隐式intent,为了组件能够匹配到具体合适的intent。Android内部的intent解析机制是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其定义的Intent,最终找到匹配的intent。在这个解析过程中,Android通过intent的Action、Category和Data这三个属性来进行判断,并且是都满足的情况才可启动这个组件。如果一个filter的Action可以,但是category不对,也不行的。

如上图所示,对intent filter来说,进行ACTION, DATA,CATEGORY的分析比较是一个intent filter的基本机制。下面分述如下:

【1】Action

如果一个组件想要接收某个intent,那么它的intent filter中action元素必有与这个intent相同的action(在定义action的前提下)。Intentfilter中定义的action,不再像前面使用缩写的常量,需要使用android.intent.action.EDIT之类。创建一个Intent filter非常简单,只需要在Activity 的子元素中定义,如下图所示:

接着定义Activity和Intent.将intent的Action设为其中一个Action.

【2】Category

同前面Action一样,一个组件想要响应一个intent就必须与这个intent具有相同的Category,但是通常有些intent对DEFAULT Category 都不设置,默认就是这个Category,但是对Intent filter那是不可以的,一定要有DEFAULT Category设置。如前面所述,Android 2.2以后,对intent filter要求更加严格,也就是说,前面的Action一定要存在。否则无法查找到相应的组件。如下所示定义一个Intent的一个自定义ACTION和一个CATEGORY。

接着再定义一个intent filter用来匹配对应用的intent.

【3】Data

Data属性是Android要访问的数据,和前面两个属性一样,在intent filter中也可以声明Data属性。声明Data属性需要同时指定访问数据的URI和MIME类型。在Intent filter中Data 属性分为四个独立的属性进行设置,共同组成一个URI:scheme://host:port/path

从这里可以看出intent filter在匹配data时候的一些规则的不同,它是以intent filter为最大集,比喻说intent filter定义了http://www.sina.com.cn,但实际上它是可以匹配http://www.sina.com.cn/boke等子路径的。同样对MIME类型,更是如此,它可以支持通配符如"text/*”或者“audio/*”等。Data属性匹配规则如下:

【1】如果intent 对象中没有包含data,<intent-filter>列表中也没有包含DATA,这种情况下一般通过ACTION来匹配。

【2】如果Intent 对象包含URI但是没包括类型,并且类型不能从URI中自动识别,那么<intent-filter>列表中也只能包含URI,才能匹配

【3】相反,如果Intent对象只包含类型,不包含URI,那么<intent-filter>也只能含类型,不含 URI

【4】如果Intent 对象中既包含URI又包括Type,那么在<intent-filter>中也必须二者都包含。

创建一个Intent时设置data 属性,如下所示,使用Uri类进行parse.

在<intent-filter>中使用data属性进行匹配。

3.1.1 Intent filter 类及packageManager

前面我们着重谈到的都是通过在xml文件中定义intent filter,实际上intent filter也是一个类,如下图所示。它可以在receiver中直接注册使用。

从类中,你可以使用add方法将相关属性填入其中。

转载于:https://blog.51cto.com/acreep/677525

3.1 Android组件intent filter相关推荐

  1. 3.0 Android组件之间的信使Intent

    应用的三个核心组件:activity,service 和broadcast receiver 都是通过intent来触发的.Intent直译为"意图.意向".通常也可以理解为不同组 ...

  2. Android 意图(Intent)和过滤器(Filter)

    Android意图是一个要执行的操作的抽象描述.它可以通过 startActivity 来启动一个活动,broadcastIntent 来发送广播到任何对它感兴趣的广播接受器组件,startServi ...

  3. android 意图过滤,Android 意图(Intent)及过滤器(Filter).pdf

    Android 意图(Intent)和过滤器(Filter) Android 意图(Intent)和过滤器(Filter) Android意图是⼀个要执⾏的操作的抽象描述.它可以通过 startAct ...

  4. Android组件的通讯-Intent

    1.概述 一个应用程序的三个核心组件--activities.services.broadcast receivers,都是通过叫做intents的消息激活.Intent消息是一种同一或不同应用程序中 ...

  5. Android Intent And Intent Filter

    2019独角兽企业重金招聘Python工程师标准>>> 1.概述 一个应用程序的三个核心组件--activities.services.broadcast receivers,都是通 ...

  6. Android组件(二)Intent

    Android组件(二)Intent 1.Intent 2.显式Intent 2.1显式Intent,即指定组件形式 2.2 显示Intent启动活动 2.3 启动活动代码实现 3.隐式Intent: ...

  7. Android组件之BroadCast简单实践

    作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源 ...

  8. intent Filter

    intent Filter 一.介绍 如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter就是 用来 ...

  9. Android值Intent匹配规则挖掘(PMS获取系统apk信息过程)

    Intent的查找与匹配 App信息表的构建 在Android开发中,Intent是极其重要的一个类,他是个个组件,进程之间通信的纽带,那么系统是如何通过Intent来查找对应的组件的呢? 在Andr ...

最新文章

  1. Apache2.2安装图解
  2. 作业调度框架 Quartz 学习笔记(三) -- Cron表达式
  3. php中final关键字
  4. 日子过得真快,转眼就工作了4个月了
  5. Feed43自定义 RSS 订阅源
  6. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第五章——自编解析与答案
  7. 全排列(我开始怀疑自己的智商了....)
  8. Kali Firefox
  9. 前端学习(148):html和xhtml的区别
  10. java操作redis并发_使用Redis incr解决并发问题的操作
  11. Unity面试题精选(7)
  12. java运费模板设计_猿实战17——实现你未必知晓的运费模板
  13. java多线程同步与测试_Java多线程同步Synchronized深入解析
  14. 智能家居,在互联中看见全屋智能
  15. Linux防火墙firewalld安全设置
  16. 华南师范大学计算机学院学硕,华南师范大学计算机学院研究生导师简介肖菁
  17. iphone的铃声格式
  18. 基于TI-RTOS的CC2650DK开发(14)---邮箱
  19. 桌面背单词,单词图片做背景
  20. 远控软件VNC攻击案例研究

热门文章

  1. OpenCV方向梯度直方图HOG的实例(附完整代码)
  2. Qt Creator指定动态属性
  3. C++结合插入排序和合并排序的算法(附完整源码)
  4. C语言实现自组织映射kohone/trace算法(附完整源码)
  5. QT绘制带有数据源的图表
  6. python爬虫今日头条街拍美图开发背景_分析Ajax请求并抓取今日头条街拍美图:爬取详情页的url与实际页面上显示不符...
  7. 华为nove计算机在哪里,华为Nova手机备忘录怎么同步到电脑
  8. 新手制作bom表格教程_抖音短视频怎么制作?这里有全部最新教程+指导,新手0基础上手!...
  9. 11_CollapsingMergeTree,(State行和Cancel行匹配示例),聚合查询,Cancel状态行取反的聚合查询
  10. 架构之路之spring+springmvc+maven+mongodb的搭建(转载:http://blog.csdn.net/tomcat_2014/article/details/55100130)