简述IntentFilter(意图过滤器)

阅读: 评论:0

简述IntentFilter(意图过滤器
1.什么是IntentFilter ?
IntentFilter翻译成中⽂就是“意图过滤器”,主要⽤来过滤隐式意图。当⽤户进⾏⼀项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻可以响应该操作的组件,服务。
例如:当⽤户点击PDF⽂件的时候,Android系统就会通过设定好的意图过滤器,进⾏匹配测试。到能够打开PDF⽂件的APP程序。
代码:
<activity android:name="stmain.ShowActivity" >
<intent-filter>
<action android:name="data" />
<category android:name="my.test.show" />
<data android:pathPattern=".*\\.jpg" android:scheme="http" />
</intent-filter>
</activity>
2.IntentFilter 如何过滤隐式意图?
Android系统会根据我们配置的Intent Filter(意图过滤器),来进⾏匹配测试。匹配的时候,只会考虑三个⽅⾯:动作、数据(URI以及数据类型)和类别。也就是说Android系统会进⾏“动作测试”,“数据测试”,“类别测试”,来寻可以响应隐式意图的组件或服务。
另外,当对其他App程序开放组件和服务的时候也需要配置Intent Filter(意图过滤器),⼀个Activity可以配置多个<intent-filter>。
3.动作测试:
对应<intent-filter>中的<action/>标签;
(1) 如果<intent-filter>标签中有多个<action/>,那么Intent请求的Action,只要匹配其中的⼀条<action/>就可以通过了这条<intent-filter>的动作测试。
(2) 如果<intent-filter>中没有包含任何<action/>,那么⽆论什么Intent请求都⽆法和这条<intent-filter>匹配。
(2) 如果Intent请求中没有设定Action(动作),那么这个Intent请求就将顺利地通过<intent-filter>的动作测试(前提是<intent-filter>中必须包含有<action/>,否则与第⼆条冲突)。
4.类别测试:
对应<intent-filter>中的<category />标签;
(1)Intent中的类别必须全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />将不会导致匹配失败。
例如:Intent中有3个类别,⽽意图过滤器中定义了5个,如果Intent中的3个类别都与过滤器中的匹配,那么过滤器中的另外2个,将不会导致类别测试失败。
注意:有⼀个例外,Android把所有传给startActivity()的隐式意图当作他们包含⾄少⼀个类别:"android.intent.category.DEFAULT"(CATEGORY_DEFAULT常量)。因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)
5.数据测试:
对应<intent-filter>中的<data>标签;
<data>元素指定了可以接受的Intent传过来的数据URI和数据类型,当⼀个意图对象中的URI被⽤来和⼀个过滤器中的URI⽐较时,⽐较的是URI的各个组成部分。
例如:
如果过滤器仅指定了⼀个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;
如果过滤器指定了⼀个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的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: 数据”,如果它的过滤器仅列举了⼀个数据类型。
例如l中有:
<intent-filter>
  <action android:name="com.nanlove.wangshiming"/>
  <action android:name="wangshiming"/>
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="wangshiming.intent.category"/>
  <data android:scheme="love" android:host=""
      android:port="888" android:path="/MM" android:mimeType="text/plain"/>
</intent-filter>
对于<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=""  android:port="888" android:path="/MM" />数据项⼀定要完全匹配。
当数据和数据类型 android:mimeType="text/plain"同时存在的时候,不能使⽤intent.setData(Uri.parse("love://:888/MM")) ;
因为setData的⽅法会⾃动清除前⾯的数据类型:This method automatically clears any type that was previously set by setType;
所以后⾯的setType就⽆法匹配,应该使⽤intent.setDataAndType(Uri.parse("love://:888/MM"), "text/plain");
提⽰:在同⼀个应⽤内,能使⽤显⽰意图,就尽量使⽤显⽰意图,增加程序的效率,理论上隐式意图匹配规则是需要花时间寻的。

本文发布于:2023-05-04 21:34:17,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/87510.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:意图   过滤器   测试   匹配   数据类型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图