首页 > 编程知识 正文

一个intent组件包含哪些属性(FilterRegistrationBean)

时间:2023-05-06 19:14:51 阅读:76009 作者:1863

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即可。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。