1.什么是IntentFilter ?
IntentFilter翻译成中文是“意图过滤器”,主要用于过滤隐含意图。 当用户执行操作时,Android系统将根据配置的“意图过滤器”查找能够响应该操作的组件、服务。
例如,当用户单击PDF文件时,Android系统将通过配置的意图过滤器进行匹配测试。 找到可以打开PDF文件的APP程序。
代码:
activity Android 3360 name=' com.example.test main.show activity ' intent-filteraction Android 3360 name=' test.update cacain data Android 3360 path pattern='.*".jpg ' Android 3360方案=' h ttern
安卓系统根据我们配置的Intent Filter (意图过滤器)进行匹配测试。 匹配时,只考虑2.IntentFilter 如何过滤隐式意图?,动作,数据(URI以及数据类型)三个方面。 也就是说,Android系统通过“行为测试”、“数据测试”和“类别测试”来查找符合隐式意图的组件和服务。
另外,向其他App程序开放组件和服务时也需要构成Intent Filter (意图过滤器),可以由一个Activity构成多个intent-filter。
类别
对应于intent-filter的动作/标签;
)1)如果Intent-filter标签中有多个Action/,则intent请求的action只要符合其中一个Action/,就可以通过该Intent-filter的操作测试。
)如果Intent-filter不包含action/,则任何intent请求都与此Intent-filter不匹配。
)如果Intent请求未设置“操作”,则该Intent请求将通过intent-filter操作测试(intent-filter必须包含操作/)
3.动作测试:
对应于intent-filter的类别/标签
)1) Intent的所有类别都必须与intent-filter的category /匹配,但intent-filter的多余category /匹配不失败。
例如,Intent有三个类别,而意图过滤器定义了五个类别。 如果Intent的所有三个类别都与过滤器匹配,则剩下的两个过滤器不会通过类别测试。
有4.类别测试:例外。 Android将传递给startActivity ()的隐式意图视为至少包含一个类别。 (' Android.intent.category.default ' ) (category ) )。 因此,希望接收隐式意图的活动必须在这些意图过滤器中包含“Android.intent.category.default”。 (在android.intent.action.MAIN和Android.intent.category.launcher中设置的过滤器除外)
注意:
对应于intent-filter的数据标签;
data元素指定从Intent传递的数据的URI和数据类型。 如果意图对象中的URI用于与过滤器中的URI进行比较,则会比较URI的每个组件。
例如:
如果过滤器只指定了一个方案,则该方案的所有URIs都与此过滤器匹配。
如果过滤器指定了方案、主机名,但没有路径部分,则所有sch都具有相同的
eme和主机名的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项可以有多个只要匹配其中一个就可以了
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");
提示:在同一个应用内,能使用显示意图,就尽量使用显示意图,增加程序的效率,理论上隐式意图匹配规则是需要花时间寻找的。
另外本人还开设了个人公众号:JiandaoStudio ,会在公众号内定期发布行业信息,以及各类免费代码、书籍、大师课程资源。
扫码关注本人微信公众号,有惊喜奥!公众号每天定时发送精致文章!回复关键词可获得海量各类编程开发学习资料!
例如:想获得Python入门至精通学习资料,请回复关键词Python即可。