
组件的intent-filter属性
如果一个 Intent 请求在一片数据(Uri)上执行一个动作(Action), Android 如何知道哪个应用程序的哪个组件能用来响应这个请求呢?Intent Filter 就是用来注册 Activity 、Service 和 Broadcast Receiver 具有能在某种数据上执行某种动作的能力。使用 intent-filter 指定action、data等属性后,应用程序组件就会告诉 Android ,它们能为请求执行哪些动作、传递的是那种类型的数据的组件提供服务,这些组件包括同一个程序的组件、本地的或第三方的应用程序。也就是说,只有某一 Intent 中的Action及Data和我们在清单文件中为Activity、Service 或 Broadcast Receiver 指定的 intent-filter 相匹配,我们这些组件才响应此 Intent 。
intent-filter 标签下仅有三个属性data 、action 、category ,和 Intent 中的属性相对应,属性的值也和 Intent 中定义的对应常量的值相同,如:public static final String ACTION_VIEW = "android.intent.action.VIEW";
public static final String ACTION_MAIN = "android.intent.action.MAIN";public static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
注意:1、一个 Intent 只能指定一个action,但是一个Activity、Service 或 Broadcast Receiver 可以监听多个action(即intent-filter中可以设置多个),这是两个不同的概念!2、Intent 的Category 默认值为CATEGORY_DEFAULT,为防止出bug,建议intent-filter 中都至少添加一个category 属性,比如默认创建的MainActivity 的配置如下:<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>3、可以添加任意个 data(或category ) 标签,由于匹配时是 “or” 的关系 ,因此,只要其中任意一个 data 与 Intent 匹配,系统就会激活你的 Activity。如下为系统浏览器的 intent-filter 配置。<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="http" /><data android:scheme="https" /><data android:scheme="about" /><data android:scheme="javascript" /></intent-filter>
intent-filter中的data属性
data属性包括两方面:Uri 和 mimeType ,类似windows下的文件路径和后缀名(PS:我们可以这么不严谨的认为,Windows下文件的后缀名对文件没有实际影响,仅仅是标识文件的类型)。
和Intent中API的对应关系:Intent(String action, Uri data)//Uri即为通过setData设置的数据
setData(Uri data)setDataAndType(Uri data, String type)//Set an explicit MIME data type.注意:调用setData后会将 mimeType 置为 null, 调用setType后会将 data 置为 null,所以若想同时设置 data 与 mimeType ,必须使用setDataAndType方法 。往往出现的空指针异常,可能就是因为上面的原因故而找不到匹配的Activity所导致的。
data中的mimeType属性
MIME:全称Multipurpose Internet Mail Extensions (多功能Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。MIME类型就是设定具有某种扩展名的文件限定使用某种应用程序来打开的方式类型,当某种扩展名文件被访问的时候,浏览器会自动使用指定的应用程序来打开。多用于指定一些客户端自定义的扩展名,以及一些媒体类型文件的打开方式。在Android中通过文件的MIME类型来判断有哪些应用程序可以处理这些文件,并使用其中的某一个应用程序(如果有多个可选的应用程序,并且在没有设定哪个是默认的应用程序之前,用户必须指定选择使用哪一个)处理之。
data中的Uri系列属性
Uri由四部分属性组成:android:scheme、android:host、android:port、path属性
其数据模型为:
注:path 属性可以使用 data 属性中的 android:path、android:pathPrefix 或 pathPattern,如:对于某个URI file【://】com.android.jony.test【:】520【/】mnt/sdcard
- scheme-->file
- host-->com.android.jony.test
- port-->520,一般都不写端口号,因为都有默认的端口号。
- path-->mnt/sdcard
其中host和port为URI的authority,如果没有指定host,port将被忽略。
path、pathPrefix、pathPattern 之间的区别 path 用来匹配【完整】的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配; pathPrefix 用来匹配路径的【开头】部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了; pathPattern 用表达式来匹配整个路径,这里需要说下匹配符号与转义。 匹配符号: 【*】用来匹配0次或更多 【.】用来匹配任意字符 因此 【.*】就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”... 转义:因为当读取 Xml 的时候,【/】是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。 如:【*】这个字符就应该写成 【//*】,而【/】 这个字符就应该写成 【////】
Activity等组件的intent-filter和Intent中Uri进行匹配时的规则:
- 若intent-filter中只设置了scheme,只会比较Uri的scheme部分
- 若intent-filter中设置了scheme和authority(host和port),那么只会匹配Uri中的scheme和authority
- 若intent-filter中设置了scheme、authority和path,那么只会匹配Uri中的scheme、authority、path(path可以使用通配符进行匹配)
- 若intent-filter中设置了mimeType,则一定会进行数据类型的匹配,即便 mimeType 设置为 "*/*" 也是如此
Uri中常见的scheme属性
注意:data中属性的是 scheme 不是 schema。也许你记得 xmlns:Android="http://schemas.android.com/apk/res/android" 这段声明,你就会想起其中的 schema ,但这里的是 scheme 不是 schema。scheme:计划; 体系; 阴谋schema:概要; 计划; 图表;
【tel://】:号码数据格式,后跟电话号码【mailto://】:邮件数据格式,后跟邮件收件人地址【smsto://】:短息数据格式,后跟短信接收号码【content://】:内容数据格式,后跟需要读取的内容【file://】:文件数据格式,后跟文件路径【market://search?q=pname:包名】:市场数据格式,在Google Market里搜索指定包名的应用【market://details?id=包名】:市场数据格式,在Google Market里跳转到指定包名应用的详情页
【geo://latitude,longitude】:经纬数据格式,在地图上显示经纬度指定的位置
【mqqwpa://im/chat?chat_type=wpa&uin=909120849&version=1"】:和指定QQ聊天【http://】:HTML链接
小结
intent-filter 总结:
- intent-filter声明了需要接收怎样的Intent,当发送的Intent和intent-filter中定义的相符合,就会启动相应的Activity
- 当有多个Activity符合发送的Intent时,Android系统会列出所有满足Intent的Activity,用户可以通过选择进行相关的操作
- 在一个Activity的intent-filter中可以有多个action、多个category、多个data,这样可以有多种组合与Intent进行匹配
- 注意:如果在一个Activity中有多个Intent进行匹配的时候,建议使用多个intent-filter与Intent进行匹配
- data属性,这是一个进行反向限制Intent的操作,要求Intent的data必须是intent-filter中声明的数据之一。
匹配示例
例子1:匹配某个【站点】的以【.pdf】结尾的 【http】 路径,使得别的程序想要打开网络中某个站点的 pdf 文件时,用户能够选择我们的程序进行查看。注意:如果在 data 标签里增加 android:host="yoursite.com",只会匹配 http://yoursite.com/xxx/xxx.pdf,但不会匹配 http://www.yoursite.com。如果你也想匹配这个路径的话,你就需要再添加一个 data 标签,除了 android:host 改为“www.yoursite.com”其他都一样。整个 intent-filter 设置为:<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><dataandroid:host="yoursite.com"android:pathPattern=".*//.pdf"android:scheme="http" /><dataandroid:host="www.yoursite.com"android:pathPattern=".*//.pdf"android:scheme="http" /></intent-filter>这里设置 category 的原因是,创建的 Intent 的实例默认 category 就包含了 Intent.CATEGORY_DEFAULT ,google 这样做的原因是为了让这个 Intent 始终有一个 category。
例子2:如果我们做的是一个IM应用,或是其他类似于微博之类的应用,如何让别人通过 Intent 进行调用出现在选择框里呢?我们只需注册 android.intent.action.SEND 与 mimeType 为 “text/plain” 或 “*/*” 就可以了,整个 intent-filter 设置为:<intent-filter><action android:name="android.intent.action.SEND" /><category android:name="android.intent.category.DEFAULT" /><data mimeType="*/*" /></intent-filter>
例子3:如果我们做的是一个音乐播放软件,当在文件浏览器中打开某音乐文件的时候,如何使我们的应用能够出现在选择框里?这类似于文件关联了,其实做起来跟上面一样,也很简单,我们只需注册 android.intent.action.VIEW 与 mimeType 为 “audio/*” 就可以了,整个 intent-filter 设置为:<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="audio/*" /></intent-filter>
案例--自定义action及data
自定义Action及Data的Activity:public class MyActionActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);if (getIntent() != null) {textView.setText(getIntent().getDataString() + "\n" + getIntent().getStringExtra("bqt"));}setContentView(textView);}}
其在清单文件中配置:<activityandroid:name=".MyActionActivity"android:label="@string/title_activity_hide" ><intent-filter><action android:name="com.bqt.mAction" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="application/mMimeType" /><data android:scheme="mScheme" /><data android:host="com.bqt.mHostName" /><data android:port="20094" />
<data android:pathPattern=".*//.bqt" /><data android:pathPrefix="/mPathPrefix" /></intent-filter></activity>
激活此Activity的Intent(可以是任意应用的任意组件发出的Intent)Intent intent = new Intent("com.bqt.mAction");//指定动作,须和清单文件中定义的值一致才可激活该Intentintent.addCategory(Intent.CATEGORY_DEFAULT);//若清单文件中定义的值为默认值,这里可不设置//注意:路径为【/mPathPrefix…】而非【mPathPrefix…】,在此案例中,清单文件中的路径必须以【/】开头,否则匹配失败!麻蛋的,我在这里卡了一个下午!Uri uri = Uri.parse("mScheme://com.bqt.mHostName:20094/mPathPrefix/anythingBehindIsOk");intent.setDataAndType(uri, "application/mMimeType");//注意:String type 格式不能乱写,否则根本无法匹配!麻蛋的,我在这里又卡了一个下午!intent.putExtra("bqt", getPackageName());startActivity(intent);
intent-filter data Uri 意图过滤器 详解的更多相关文章
-
Asp.Net MVC学习总结之过滤器详解(转载)
来源:http://www.php.cn/csharp-article-359736.html 一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...
-
MVC过滤器详解
MVC过滤器详解 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...
-
【DataGuard】部署Data Guard相关参数详解 (转载)
原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler 有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...
-
Wireshark过滤器详解
Wireshark过滤器详解 1.Wireshark主要提供两种主要的过滤器 捕获过滤器:当进行数据包捕获时,只有那些满足给定的包含/排除表达式的数据包会被捕获 显示过滤器:该过滤器根据指定的表达式用 ...
-
Android开发学习笔记:Intent的简介以及属性的详解【转】
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
-
angular-ngSanitize模块-linky过滤器详解
本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个 ...
-
【转载】Android开发学习笔记:Intent的简介以及属性的详解
http://liangruijun.blog.51cto.com/3061169/634411/ 一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent ...
-
【转】【Java/Android】Intent的简介以及属性的详解
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
-
php://input,php://filter,data URI schema的那些事
一.php://input一句话木马 在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件 ...
随机推荐
-
Ruby学习之module
我们可以认为module是一个专门存放一系列方法和常量的工具箱. module和class非常像, 只是module不能创建实例也不能有子类, 它们仅仅能存放东西. 例如: module Circle ...
-
iOS学习01C语言数据类型
1.注释 // 单行注释 // 注释对代码起到解释说明的作用,注释是给程序员看的,不参与程序运行 /* 多行注释 Xcode快捷键 全选 cmd+a 复制 cmd+c 粘贴 cmd+v 设 ...
-
WCF 入门 (21)
前言 再不写一篇就太监了,哈哈. 第21集 WCF里面的Binding Bindings in WCF 其实不太了解为什么第21集才讲这个Binding,下面都是一些概念性的东西,不过作为一个入门视频 ...
-
夺命雷公狗---DEDECMS----18dedecms之无可奈何标签-sql标签取出今天更新
我们在一些开发时候遇到普通标签都解决不了的问题的时候可以尝试下我们dedecms自带的sql标签,几乎可以完成任何的查询需求 语法如下所示: 我们在这里将刚才首页今天更新那块给改写下,原先的是: {d ...
-
EF 中更新模型的问题,这种错误(因为相同类型的其他实体已具有相同的主键值。)
在EF经常在更新模型的时候可能会同时操作一个实体几次. 其实除了SaveChanges外,其它的几次基本都是要查询出一个结果, 例如更新的时候,我们要查一下这个表中有没有相同的纪录之类的. 查询完之后 ...
-
spring-AOP(面向切面编程)-xml方式配置
AOP是针对面向对象编程的一种补充,有时使用面向对象不能很好完成一些额外的功能业务时,可以采用AOP来进行补充. AOP术语: 切面(Aspect) 切面是用于编写切面逻辑的一个类,这个类很类似于JD ...
-
【html5】解决HTML5新标签不兼容的问题
html5标签: 1.语义化好 -> SEO a). 程序交流方便 b). 搜索引擎友好 baidu -> 不认识 google 2.本身不兼容,想兼容低版本,请使用如下方法: 方式一:使 ...
-
2010-10-08在浏览器中兼容+jQuery3
一.实现背景图片铺满(兼容各种浏览器) <script type="text/javascript"> $(document).ready(function() { $ ...
-
从零开始学 Web 之 jQuery(七)事件冒泡,事件参数对象,链式编程原理
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
-
nginx反向代理配置相对路径
需求: 在公司内部搭建了一个php的网站,想用花生壳映射到外网. 一.反向代理解决直接映射不成功问题 直接用把花生壳的"域名+端口"指向此php网站并竟然不生效.但是不加网站名可以 ...