IntentFilter学习笔记

最近学习《Android开发艺术探索》中的IntentFiler部分,获益良多。以前项目中使用显式启动为多,很多时候看到隐式启动的category配置时都有点摸不着头脑,这下完全清晰了,在这里做下笔记,以备查询。


IntentFilter的作用

 

用于规定组件隐式启动时的匹配规则。规定了在隐式调用时,什么样的Intent能够启动设置了这个IntentFilter的组件。

IntentFilter的组成

 

IntentFilter包含3种类型的匹配项,Intent只有同时满足3个匹配项,才能启动该组件

Action

 

action是一个字符串,一个Intent只要actionIntentFilter中定义的action中的一个完全一致,就可以匹配成功。Action区分大小写

 

Category

['kætəɡɔːri]

 

category同样是一个字符串,它和action的区别在于,如果Intent包含了category,那么它所包含的所有category,都必须在IntentFilter找到完全一样的category,才算匹配成功。

另外,由于系统在调用startActivitystartActivityForResult时,会默认为Intent添加上"android.intent.category.DEFAULT"这个category,所以当我们的IntentFilter设置了这个category时,Intent即使不设置任何category,也能匹配成功。

 

Data

 

data用于规定,在启动对应组件时,Intent必须传递过来的资源的Uri和资源类型,例如,如果我们要启动一个用于操作缩放图片的activity,必须在Data中传递过来一张图片的地址。dataaction一样,只要Intent中的data能够匹配到IntentFilter中的其中一个data,即算是匹配成功。

data的结构如下:

 

<dataandroid:scheme="string"

android:host="string"

android:port="string"

android:path="string"

android:pathPattern="string"

android:pathprefix="string"

android:minetype="string"/>

 

data的内容包合2个部分,资源Uri的限制和资源的类型

Uri的结构如下:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

Uri的具体例子

Content://com.example.project:200/folder/etc

http://www.baidu.com:80/search/info

 

Scheme

Uri的模式,例如httpfilecontent等,如果URI中没有指定scheme,那个整个URI的其他参数都无效,URI是无效的

Host

Uri的主机名,例如www.baidu.com192.168.1.1等,如果host未指定,那么URI的其他参数和URI本身,都是无效的

Port

uri的端口号,例如8080,只有uri指定了schemehostport才有效

PathpathPatternpathPrefix

path表示完整的路径信息。pathPattern也表示路径信息,但它可以通过*来表示0个或多个任意字符。这使得IntentFiler匹配的路径更加灵活。同时,由于正则表达式的规范,要表示真正的*/,则需要写成"//*"""pathPrefix表示路径的前缀信息

 

例如:

<intent-filter>

<data android:mimeType="image/*"/>

</intent-filter>

 

这个过滤规则规定,Intent必须传递任意类型的图片。这种情况下虽然没有指定URI,但却有默认值contentFile。即是说,为了匹配这个FilterIntentUri部分scheme必须为content或者file才能匹配。

匹配的Intent例子如下:

Intent.setDataAndType(Uri.parse("file://data/data/com.example.project/a.png"),"image/png").

 

Intent要设置完整的Data,必须调用setDataAndType方法,不能通过先调用setData再调用setType方法,因为后2个方法会互相清空对方的值

 

另外,和action不同的是,以下2种方式设置的data,起同样的效果

 

<intent-filter…>

<data android:scheme="file"android:host="www.baidu.com"/>

</intent-filter>

 

<intent-filter…>

<data android:scheme="file"/>

<data android:host="www.baidu.com">

</intent-filter>

 

 

IntentFilter的匹配规则对应ServiceBroadcastReceiver也是同样的道理,不过系统对应Service的建议是尽量使用显示调用来启动服务

 

检测Intent是否匹配成功

为了避免隐式启动Activity时因找不到匹配的activity而报错,应该先检查是否匹配成功。方法有2种:

1.PackageManager的方法:public abstract ResolveInfo resolveActivity(Intent intent,intflags)

2.Intent的方法:public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags)

 

上述2个方法中的第二个参数,我们要使用MATCH_DEFAULT_ONLY,它的含义是只匹配包合"android.intent.category.DEFAULT"这个categoryactivity。如果不使用这个标记位,可能会导致startActivity失败,因为不包含DEFAULT这个categoryactivity是无法接收隐式Intent的。

另外,针对ServiceBroadcastReceiver,PackageManager同样提供了类似的方法去获取成功匹配的组件信息


天梯(tianti) Java 轻量级的 CMS 解决方案-天梯。天梯是一个用 Java 相关技术搭建的后台 CMS 解决方案,用户可以结合自身业务进行相应扩展,同时提供了针对 dao、service 等的代码生成工具。技术选型:Spring Data JPA、Hibernate、Shiro、 Spring MVC、Layer、MySQL 等。 简介: 1、天梯是一款使用Java编写的免费的轻量级CMS系统,目前提供了从后台管理到前端展现的整体解决方案。 2、用户可以不编写一句代码,就制作出一个默认风格的CMS站点。 3、前端页面自适应,支持PC和H5端,采用前后端分离的机制实现。后端支持天梯蓝和天梯红换肤功能。 4、项目技术分层明显,用户可以根据自己的业务模块进行相应地扩展,很方便二次开发。 核心框架:Spring Framework 4.2.5.RELEASE 安全框架:Apache Shiro 1.3.2 视图框架:Spring MVC 4.2.5.RELEASE 数据库连接池:Tomcat JDBC 缓存框架:Ehcache ORM框架:Spring Data JPA、hibernate 4.3.5.Final 日志管理:SLF4J 1.7.21、Log4j 编辑器:ueditor 工具类:Apache Commons、Jackson 2.8.5、POI 3.15 view层:JSP 数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highcharts 3D图表 :highcharts-more 轮播图 : jquery-swipe 表单提交 :jquery.form 文件上传 :jquery.uploadify 表单验证 :jquery.validator 展现树 :jquery.ztree html模版引擎 :template
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值