查看: 149|回复: 0

intent-filter的action,category,data匹配法则

[复制链接]
发表于 2016-10-13 17:48:25 |未经授权,严禁转载,违者必究... | |阅读模式
匹配 法则 filter intent action intent filter action intent category intent category作用 intent.addcategory intent category大全 intent.category home intent 设置category intent的category filter category
我们知道有两种体例来启动Activity,显示挪用和隐式挪用。当利用隐式挪用时,又会涉及到IntentFilter的匹配法则。我确信年夜大都开辟者很少存眷隐式挪用,因为日常平凡开辟顶用到年夜大都是显示挪用。例如:用Intent直接打开一个Activity,或者用Intent经由过程包名等其他信息打开别的一个应用等。而隐式挪用则利用的比力少,当然也不是完全不利用。例如:当我们需要打开浏览器拜候某个链接时,手机上可能存在多个浏览器,我们也无法拿到某一个浏览器的包名,那么一般环境下我们会写如下代码:  
执行完这段代码后,系统将会弹框提醒选择哪个浏览器打开
。只要这个Intent中的action(经由过程setAction()方式设置装备摆设)能和Activity设置装备摆设的过滤法则中的任何一个action不异即可匹配成功(这里后面会具体阐发)。这里就申明Intent中action匹配到了多个Activity,所以系统会将所有能打开这个链接的应用展示出来供用户选择。这种经由过程action匹配activity的体例就是一种典型的隐式挪用。
起首我们先阐发显示挪用和隐式挪用的道理:
示例2: 打开一个Activity
(这种体例从严酷上讲不算显示挪用,因为显示挪用的意义是 :需要明白的指出被启动的对象的组件信息,包罗包名和类名,这里并没有指出包名 。)
运行成果会像如许:
为什么会匹配到这么多应用的Activity? 因为在这些Activity的IntentFilter匹配法则中有如下法则:  
因为我们这里没有匹配其他的前提,所以会匹配到良多应用的Activity,我们可以添加其他的匹配前提,好比入“category”,“data”的匹配来加倍切确的匹配到所需要的Activity)


  

然后挪用以下方式即可匹配到AActivity:
留意:
1、系统界说了一些Action
。当然我们也可以本身界说action。好比   
public void match() {   
  Intent intent = new Intent();   
  //只设置一个action。依旧可以或许成功。
  intent.setAction("com.axe.mg.what");   
  startActivity(intent);
}
3.category的匹配法则
假如Intent中的存在category那么所有的category都必需和Activity过滤法则中的category不异。才能和这个Activity匹配。Intent中的category数目可能少于Activity中设置装备摆设的category数目,可是Intent中的这category必需和Activity中设置装备摆设的category不异才能匹配
运行以下代码可以匹配到AActivity:
留意:1、只经由过程category匹配是无法匹配到AActivity的。因为category属性是一个执行Action的附加信息。
所以只靠category是无法匹配的。像如下代码:
近似于action匹配,可是data有更复杂的布局
data 由两部门构成
mineTypeURI
URl 可设置装备摆设更多信息,近似于url
。我们可以看下URI的布局
我们看下URL的属性:
b.一些实例
(1)只匹配scheme
匹配该Activity只需要data中scheme为axe就能匹配到
(2)匹配 scheme host port
匹配这个Activity需要 scheme 为 axe ,host 为 www.axe.com, port为8888才能匹配。 只要有一个不准确都无法匹配
(3)匹配 scheme host path
匹配这个Activity 必需 scheme为 axe, host 为 www.axe.com, path 为 mypath
才能匹配
(4) 匹配 scheme host port path
匹配这个Activity 必需 scheme为 axe,,host 为 www.axe.com, path 为 mypath,
port 为8888 才能匹配
(5)mintype匹配
可以看到我们添加了mimeType
。这种匹配方式我们需要做改变。我们不克不及利用
setType 和 setData , 需要利用setDataAndType()
从源码可以看出:setType() 会将URL设为null; setData()会将mineType设为null;以下为源码:
匹配这个Activity 必需 scheme为 axe, host 为 www.axe.com, path 为 mypath,
port 为8888, mineType 为 axe/abc才能匹配

(6)Scheme的默认值content 和 file。
上面的设置装备摆设中我们并没有指定scheme。我们可以经由过程默认值content 和 file匹配。
(7)存在多个data的匹配
一个Activity只要能匹配任何一组data,而且每个data都指定了完整的属性(有时辰匹配不上, 这个纪律还未找到)
以下两种体例都可以匹配.可是有时辰会匹配不到.临时不知道纪律.建议只利用一个data.假如有多个法则需要匹配. 那就添加intent-filter
a.无法匹配时的crash log
b.一个Activity只要能匹配任何一组intent-filter,即可成功启动对应的Activity
以下两种体例都可以匹配
有参考来自:
http://www.cnblogs.com/wolipengbo/p/3427574.html
http://blog.csdn.net/eyishion/article/details/51113094
很是感激你们的blog!给我很年夜的帮忙
返回顶部快速回复上一主题下一主题返回列表

声远论坛|联系电话:0537-2311005|Archiver|手机版|小黑屋|Sitemap|声远网 |网站地图|网站地图

鲁公网安备 37089702000485号 | 鲁ICP备 18028751号 | 互联网药品信息服务资格证:(鲁)-经营性-2022-0209 | 增值电信业务经营许可证:鲁B2-20230761号 | (鲁)职介证字[223]:第08120014号

中国互联网违法和不良信息举报中心 | 山东省互联网违法和不良信息举报中心 | 人工智能生成合成内容标识办法

GMT+8, 2026-5-8 12:19, Processed in 0.094673 second(s), 28 queries , Gzip On, APCu On.

Powered by Discuz! X3.5© 2001-2026 SYUAN.COM

快速回复 返回顶部 返回列表