简述 IntentFilter(意图过滤器)

article/2025/10/30 13:51:27

转载自:http://www.cnblogs.com/ywtk/p/4158103.html 侵删

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://chatgpt.dhexx.cn/article/UUrU1vbp.shtml

相关文章

IntentFilter详解

IntentFilter的意思就是意图过滤器&#xff0c;当我们隐式的启动系统组件的时候&#xff0c;就会根据IntentFilter来筛选出合适的进行启动。 如果组件的 IntentFilter 与 Intent 中的 IntentFilter 正好匹配&#xff0c;系统就会启动该组件&#xff0c;并把 Intent 传递给它。如…

WPF MessageBox简单用法

1、弹出小框 用法&#xff1a; if (MessageBox.Show("内容", "标题", MessageBoxButton.YesNo, MessageBoxImage.Information) MessageBoxResult.Yes){label1.Content "yes";}else{label1.Content "no";} 2、例子 if (MessageBo…

C# winform 中MessageBox用法大全(附效果图)

我们在程序中经常会用到MessageBox。 MessageBox.Show()共有21中重载方法。现将其常见用法总结如下&#xff1a; 1.MessageBox.Show(“Hello~~~~”); 最简单的&#xff0c;只显示提示信息。 2.MessageBox.Show(“There are something wrong!”,“ERROR”); 可以给消息框加上…

MessageBox使用详解

Messagebox是我们编写程序时都会用到的东西&#xff0c;我每次使用的时候都能让它显示出来&#xff0c;但是我并不了解它的结构&#xff0c;或者说语法&#xff0c;下面简单总结一下。 语法 Messagebox(<字符串>text,<字符串>title&#xff0c;messageboxbuttons&a…

C#中Messagebox的简单使用

MessageBox的使用方法比较多&#xff0c;下面对常用的几种做了简单的说明&#xff0c;详细的资料可参考微软官方文档。 Messagebox.Show(String) 显示具有指定文本的消息框。 private void button1_Click(object sender, EventArgs e){//Show(String).显示具有指定文本的消息…

MessageBoxA 和MessageBoxW

文章目录 第一个参数&#xff1a;第二个参数&#xff1a;第三个参数&#xff1a;第四个参数&#xff1a;补充代码实现 MessageBoxA(NULL, text, title, MB_OK) 第一个参数&#xff1a; HWND hWnd 传入一个句柄&#xff0c;这个窗口句柄代表的窗口就是这个消息窗口的所有者&…

C#中MessageBox()用法详解

简介&#xff1a; MessageBox&#xff08;&#xff09;功能是显示一个消息对话框&#xff0c;其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息&#xff0c;如状态或错误的信息。 格式&#xff1a; MessageBox.Show&#xff08;string Text, string Caption,…

C/C++ MessageBox() 弹窗的用法

C/C MessageBox 的用法 目录 一、语法 二、头文件 三、常量 图标常量&#xff0c;按钮常量&#xff0c;返回值 四、示范 五、成品 六、通过返回值判断点击的按钮是什么 七、通过输入的文字来改变弹窗上的文字 一、语法 MessageBox(NULL,("对话框内容"),("对话…

MessageBox()函数用法及参数详解

MessageBox函数 显示模式对话框&#xff0c;其中包含系统图标&#xff0c;一组按钮和简要的特定于应用程序的消息&#xff0c;例如状态或错误信息。消息框返回一个整数值&#xff0c;指示用户单击的按钮。 语法 int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCapti…

MessageBox.Show 用法介绍

简介摘要&#xff1a;MessageBox.Show (String) 显示具有指定文本的消息框。 由 .NET Compact Framework 支持。 MessageBox.Show (IWin32Window, String) 在指定对象的前面显示具有指定文本的消息框。 MessageBox.Show (String) 显示具有指定文本的消息框。 由 .NET Compac…

C# MessageBox用法大全

C#中MessageBox用法大全&#xff08;附效果图&#xff09; 我们在程序中经常会用到MessageBox。 MessageBox.Show()共有21中重载方法。现将其常见用法总结如下&#xff1a; 1.MessageBox.Show("Hello~~~~"); 最简单的&#xff0c;只显示提示信息。 2.MessageBox.S…

MessageBox 用法详解与实例

摘自&#xff1a;教育网-自学之路&#xff1a;http://www.selfroad.com.cn/content.asp?id83 MessageBox这个函数可以在VC里面显示一个标准对话框&#xff0c;是比较常用的一个信息对话框&#xff0c;其不仅能够定义显示的信息内容、信息提示图标&#xff0c;而且可以定义按钮…

MessageBox()用法简介

MessageBox () 功能显示一个消息对话框。 语法 MessageBox (text,title{,icon{,button{,default}}}) 参数title&#xff1a;string类型&#xff0c;指定消息对话框的标题text&#xff1a;指定消息对话框中显示的消息&#xff0c;该参数可以是数值数据类型、字符串或boolean值…

C#中MessageBox用法大全(附效果图)

C#中MessageBox用法大全&#xff08;附效果图&#xff09; 我们在程序中经常会用到MessageBox。 MessageBox.Show()共有21中重载方法。现将其常见用法总结如下&#xff1a; 1.MessageBox.Show("Hello~~~~"); 最简单的&#xff0c;只显示提示信息。 2.MessageBox.S…

C语言基础进阶之 MessageBox()用法简介

MessageBox () 功能显示一个消息对话框。 语法 MessageBox (text,title{,icon{,button{,default }}}) 参数title&#xff1a;string类型&#xff0c;指定消息对话框的标题text&#xff1a;指定消息对话框中显示的消息&#xff0c;该参数可以是数值数据类型、字符串或boolea…

request.getParameter

request.getParameter(“xxx”)的参数的取值的几种可能&#xff1a; Html中form表单中标签的name属性&#xff1a; 请输入用户姓名&#xff1a; request.getParameter(“username”); Html中form表单提交时的action的参数 请输入用户姓名&#xff1a; request.getParamet…

java中的getparameter_Java中request.getParameter(realName)获取参数值为中文时乱码的解决方案...

说明&#xff1a;貌似这个问题绝大多数人都遇到过&#xff0c;开发的时候好好的&#xff0c;部署之后就出问题了&#xff01;原因是因为HTTP请求传输时将URL以ISO-8859-1编码&#xff0c;服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流&#xff0c;所以会造成中文乱码…

HttpServletRequest getParameter 为 null

一、简介 HttpServletRequest 提供了 getParameter 方法&#xff0c;可以非常方便获取请求行/请求体中key/value形式的数据(x-www-form-urlencoded、multipart/form-data&#xff0c;其都是key/value形式&#xff0c;只是对数据编码方式有差别)&#xff0c;对于application/js…

JSP内置对象request——getParameter的使用

文章目录 一、request的作用二、使用步骤 一、request是什么&#xff1f; request对象用来接收客户端提交的各种信息。客户端的请求信息被封装在request中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后作出相应。request是HttpServletRequest类的实例。request具有…

理解Java反射机制

理解Java反射机制 1. 概述2. 反射原理3. 反射的优缺点4. 反射的用途5. 反射相关的类5.1 Constructor5.2 Field5.3 Method5.4 Class类的原理 6. 反射实例6.1 创建对象6.2 获取/修改属性6.3 调用方法6.4 调用内部类 7. 小节 对于Java使用者来说&#xff0c;反射机制可以说是不得不…