【0】Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

 

【1】Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

 

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

【2】对于隐式意图,Android是怎样寻找到这个最合适的组件呢?

记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。


1.动作测试

<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和 该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一 条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。如果Intent请求 或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent- filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个 Intent请求就将顺利地通过<intent-filter>的行为测试。

2.数据测试

数据在<intent-filter>中的描述如下:
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指 定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。

数据测试同时比较意图对象和过滤器中指定的URI和数据类型。

规则如下:

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

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

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

d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。


3.类别测试

<intent-filter>元素可以包含<category>子元素,比如:
<intent-filter . . . >
<category android:name=”android.Intent.Category.DEFAULT” />
<category android:name=”android.Intent.Category.BROWSABLE” />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)


public class MainActivity extends Activity
{/** Called when the activity is first created. */@Override     public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button = (Button) this.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction("com.hoo.kay");//设置数据URI与数据类型匹配//intent.setData(data);//intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndTypeintent.setDataAndType(Uri.parse("hoo://www.hoo.com/person"), "image/gif");startActivity(intent);}});}
}


注意上面隐式意图设置匹配规则的方法,intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndType


<application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".OtherActivity"  android:label="@string/app_name"><intent-filter><action android:name="com.hoo.kay" /><action android:name="com.hoo.kesen" /><category android:name="android.intent.category.DEFAULT" /><category android:name="com.hoo.category.li" /><data android:scheme="hoo" android:host="www.hoo.com" android:path="/person"/><data android:mimeType="image/gif"/></intent-filter></activity></application>


Android中的意图匹配--IntentFilter的作用相关推荐

  1. Android中的Intent和Intent-filter总结

    一.相关概念 (一)基本概念 Intent中文意思指"意图",按照Android的设计理念,Android使用Intent来封装程序的"调用意图",不管启动Ac ...

  2. Android笔记 定义意图过滤器intent- filter demo

    本例建立在显示意图demo基础上 修改处我会加粗 1修改清单文件 配置第二个界面的意图过滤器 <?xml version="1.0" encoding="utf-8 ...

  3. android中样式文件步骤,详解Android主题开发的样式教程

    Android中的样式和css样式作用相似,都是用于为界面元素定义显示风格,它是一个包含一个或者多个view 控件属性的集合.主题是一个包含一种或者多种格式化属性的集合,你可以将其为一个单位用在应用中 ...

  4. android intent-filter作用,Android中Intent-Filter的匹配规则是什么

    Android中Intent-Filter的匹配规则是什么 发布时间:2020-12-14 15:19:32 来源:亿速云 阅读:67 作者:Leah 今天就跟大家聊聊有关Android中Intent ...

  5. Android中利用隐式意图发送短信

    Android中发送短信可以直接使用smsmanager 直接去发送短信,但是这样发送短信,用户很反感,而且需要加更多的权限,如果利用隐式意图跳转到系统应用的短信应用,发送短信这样就可以不需要去添加权 ...

  6. android中 cdf文件的作用是什么意思,行情艰难,Android初中高级面试题,附详细答案...

    原标题:行情艰难,Android初中高级面试题,附详细答案 作者:夜猫少年 链接:https://juejin.im/post/5c8211fee51d453a136e36b0 Activity篇 1 ...

  7. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...

    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...

  8. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  9. Android中minSdkVersion、targetSdkVersion、maxSdkVersion的作用

    转载自:Android中minSdkVersion.targetSdkVersion.maxSdkVersion的作用 - 谁与争锋的专栏 - 博客频道 - CSDN.NET  http://blog ...

最新文章

  1. R语言在ggplot中使用变量指定柱状图的名称实战
  2. JDK 5.0 注解的使用
  3. 1.25亿用户以后,Netflix总结的系统高可用经验
  4. mysql server-存储引擎
  5. get和post的联系与区别
  6. Win11如何调整任务栏大小 Win11调整任务栏大小的方法
  7. 单元格填充为0的html,Excel如何在数据信息表中把空单元格填写为数字“0”
  8. 清理清理火狐历史记录
  9. zz JQuery 插件
  10. 开放接口的安全验证方案(AES+RSA)
  11. 星星之火-49:5G 移动边缘计算MEC快览
  12. cad卸载工具_「Windows」不足10M的卸载软件,卸载得可真干净啊
  13. gcc: error trying to exec ‘cc1plus‘: execvp: Permission denied
  14. mysql表名大小写设置
  15. 爬虫必备,案例对比 Requests、Selenium、Scrapy 爬虫库!
  16. ( 22美赛C题)基于投资最优交易策略的研究(部分内容)
  17. 淘宝图片怎么编辑处理?淘宝图片处理用什么软件?
  18. visio流程图工具安装包的下载和安装教程
  19. canvas五彩斑斓的粒子动画js特效
  20. Vue-cli构建步骤

热门文章

  1. 使用ASIHTTPRequest 编译提示找不到libxml/HTMLparser.h的解决方法
  2. 跟互联力量学Asp.net MVC3-安装和创建
  3. DNS RR字段含义
  4. spider RPC更新至2.0.0-RELEASE
  5. 【有上下界网络流】【ZOJ】2314 Reactor Cooling
  6. 用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90)
  7. OpenLDAP实战指南上市发售
  8. SpringMVC 整合新浪微博登录 Java SDK
  9. linux VM映像chroot注入修改root密码
  10. jenkins rec cve-2019-1003000 复现