intentFiltger的匹配原则

关于intentFiltger的匹配原则,action和category就不具体描述了,相信大家也有基本的了解的,就概括说一下就行了,这篇文章主要讲述data的匹配原则,当然是以隐式跳转的主题讲解的。

1. action的匹配原则

action的匹配原则要求Intent中的action存在并且必须和过滤器规则中其中一个action相同,另外,action区分大小写。否则匹配失败。

2. category匹配原则

(1)如果不存在category,系统默认使用android:intent.category.DEFAULT,隐式跳转除外。如果要使用隐式跳转,必须在intent-filter里边制定这个属性。
(2) 如果存在,intent跳转中一旦有category,不管有几个,每个都需要能够和过滤规则中的任何一个category相同。使用addcategroy方法。可以多个category和intent-filter中的一个相同。

3. 说下action和category的不同点吧

action:intent中必须存在一个action,并且必须有一个action和过滤规则中的action相同。
category:intent中可以不存在category,但是一旦存在,那么所有的category都必须和过滤规则中的其中一个category相同。

————————————————我是分割线—————————————

好了 下边进入主题。data的匹配原则。

1. 先来看下data的用法

<data android:scheme="String"
     android:host="String"
     android:path="String"
     android:pathPattern="String"
     android:pathPrefix="String"
     android:mimeType="String"></data>

data由两部分组成,mimeType和URI组成。mimeType代表媒体类型,比如image/aaa.jpg等。URI表示路径。下边来讲解下每个数据的含义。
(1) Scheme:URI模式,比如http、filem、content等,如果URI中没有制定Scheme,那么整个URI的其他参数无效,这也就意味着整个URI无效。
(2) Host:URI的主机名,比如www./baidu.com,如果host为制定,整个URI中其他的参数无效,这也就意味着整个URI无效。
(3) Port:URI中的的端口号,比如80端口,仅当scheme和host参数制定的时候,port参数才是有意义的。
(4) path:表示完成的路径信息。
(5) pathPattern:也表示完成的路径信息,但他可以包含通配符“ * ”,* 表示 0个或者多个任意字符,需要注意的是,由于正则的规范,如果想表示真实的字符,要携程\, \要写成\\,
(6) pathPrefix:表示路径的前缀信息。

2. 分情况说明下匹配原则

(1) 代码如下:

<intent-filter>
      <data android:mimeType="image/*"
           ...  
</intent-filter>  

这种规则指定了媒体类型为所有类型的图片,那么intent中的mimeType必须为image/*才能匹配,这种情况下规律虽然没有指定URI,但是却又默认值,URI的默认值是content和file。也就是说虽然没有指定URI,但是intent的URI部分的scheme必须为content和file才能匹配。也可以这样写:
intent.setDataAndType(Uri.parse("file://abc"), "image/aaa");
这里需要注意的是必须调用setDataAndType,不能先调用setData然后调用setType,这两个方法会清除对方的值,来看下源码:

public Intent setData(Uri data) {
     mData = data;
     mType = null;
     return this;
}
public Intent setType(String type) {
     mData = null;
     mType = type;
     return this;
}

setData会把mimeType置空,setType会把URI置空。

(2) 代码如下:

<intent-filter>
     <data android:scheme="http" android:mimeType="video/aaa" ...></data>
     <data android:scheme="http" android:mimeType="video/bbb" ...></data>
</intent-filter>

剩下的我想你们应该也会写了,我就不写了。

(3) 写两种代码,作用其实是一样的。

<intent-filter>
<data android:scheme="http" android:mimeType="video/aaa" ></data> 
     ...
</intent-filter>

<intent-filter>
     <data android:scheme="http" ></data>
     <data android:mimeType="video/aaa" ></data>
     ...
</intent-filter>

————————————————我是分割线—————————————

好了,关于intentFiltger的匹配原则就先说到这里,相信大家已经有了基本的认识了,来说写题外话吧。关于Activity跳转到Service或者BroadCastReceiver同样可以使用隐式跳转,不过系统对于启动Ssrvice的建议还是使用显示跳转方法来启动服务。

我再啰嗦一点哈,你们不要打我。

PS:这点很重要

PS:这点很重要

PS:这点很重要

重要的事情说三遍。

当我们使用隐式跳转启动一个Activity的时候,可以做一下判断,看是否有Activity能匹配我们的隐式Intent.如果不能就会出现ActivityNotFoundException错误了。判断方法有两种,如果找不到匹配的Activity,则返回null:

1. PackageManager.resolveActivity():

使用PackageManager的resolveActivity方法,并且PackageManager还提供了queryIntentActivites方法,这个方法和resolveActivity不同的是,它不是返回的最佳的Activity,而是返回了所有匹配成功的Activity。源码:
public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent, int flags);
第一个参数比较好理解,第二个参数需要注意,我们需要使用MATCH_DEFAULT_ONLY这个标记位,它的含义是陪陪那些在intent-filter中生命了category android:name="android.intent.category.DEFAULT"这个category的Activity,使用这个标记位的意义在于,只要上边两个方法不返回null,那么startActivity一定可以成功,如果不用这个标记位,那就可以吧intent-filter中category不含DEFAULT的那些Activity匹配出来,从而导致startActivity可能失败,因为不包含DEFAULT这个category的Activity是无法接收隐式Intent的,在action和category中,有一类action和category比较重要,也是大家最常见的:

<intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

他们表明这是一个入口Activity并且出现在系统的应用列表中,少了任何一个都没有实际的意义,也无法出现在系统的应用列表中,另外针对Service和BroadCastReceiver,PackageManager同样提供了类似的方法获取成功匹配的组件信息。

2. 使用Intent的resolveActivity方法也是可以判断的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容