开个头 101要从黄铜调回黑铁了,太难了呀,都怪匹配给到的队友天天拉胯。。。(上单头铁盖伦打wn)。。Android的匹配机制也是给萌新当头一棒
101要从黄铜调回黑铁了,太难了呀,都怪匹配给到的队友天天拉胯。。。(上单头铁盖伦打wn)。。Android的匹配机制也是给萌新当头一棒。但萌新突出一个莽字,不知道的东西就冲塔搞他。。首先我们萌新知道的启动activity分为两种,显式调用和隐式调用。原则上一个Intent不能即是显式调用又是隐式调用,两者真共存的话以显式调用为主。
显式调用:
需要明确指定被启动对象的组件信息,包括包名和类名。例如:
Intent intent = new Intent(Mainactivity.this,SecondActivity.class);
startActivity(intent);
隐式调用:
不需要明确指定组件信息。但需要Intent能匹配目标组件的IntentFilter中所设置的过滤信息,这些过滤信息有action,cateGory,data,(这些属性是在AndroidMenifest里设置的)举个栗子吧:
//MainActivity里的第一个intentfilter
//MainActivity里的第二个intentfilter
为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息,否则匹配失败。值得一提的是一个过滤列表中的action,category和data可以有多个,而一个activity可以有多组过滤列表,如上。一个intent只有同时匹配一组intentfilter才能成功启动对应的activity。接下来就一一介绍下各种属性 匹配规则吧
action的匹配规则
看这DEFAULT应该就能猜出大半,我们不往intent里加category,系统加啊,加的就是上面这行。所以为了我们的activity能接收隐式调用,就必须在intent-filter中指定上面这个category。
data的匹配规则
data由两部分组成,mimeType和URI。mimeType指媒体类型,可以表示图片,文本,视频等不同的媒体格式(说白了就是告诉你绑定了啥后缀的东西)而URI(路径)的结构就有意思了,她长这样
://:/[||]
举个栗子
Http://www.baidu.com:80/search/info
Scheme ☞ URI的模式,比如http,file,content,如果不指定scheme,那么URI其他参数都无效,最终URI无效。
Host ☞ URI的主机名,比如www.baidu.com,host未指定也会导致URI无效。
Port ☞ 这是URI的端口号,比如上头的80
Path,PathPattern,pathPrefix ☞ 这Ⅲ代表了路径信息,path表示完整的路径,pathPattern也表示完整路径,但他可以包含“”,“”表示0个或多个字符(比如“image/*”意思就是指定了媒体类型为所有的图片),pathPrefix表示路径的前缀信息。
data的匹配分两者情况
例如:
.......
那么Intent里的mimeType必须是"image/*"才能匹配。此外,这种情况下虽然没指定URI,但有默认值,URI默认值为content和file,所以我们即使不想通过URI指定也得在intent设置的时候把intent中的URI部分的scheme设置为content或file才能成功匹配。我们可以这么写
intent.setDataAndType(Uri.parse("file://abc"),"image/png")
这种情况下每个data都指定了完整的属性值,既有URI又有mimeType。所以我们可以这么写
intent.setDataAndType(Uri.parse("http://abc"),"video/mpeg")
出了以上特点,data还有一点和action不一样
这两种写法,作用是一样的。
还有就是千万别忘了我们如果没设置scheme的话,他是有默认值的。默认值是file和content,这点很重要。setDataAndType的时候不能忘了这点。
总结:萌新常用的是隐式匹配方式,但实际上是显式匹配更准确,好用。但实际上intentfilter有什么用呢?简单来讲filter是处理活动的必须步骤,比如你发送一个intent希望这个activity打开一个网页,就要用到intentfilter,action表示了这个activity接收到intent后要干啥,category像安检,你得给出身份证明才能通过,而data更像是甲方,他想要啥你就得给啥,严格的甲方连具体的URI需求都给出来,宽松的送钱的甲方只说了mimeType格式,只要满足这个格式就能过关。如果想取出data里的东西我们可以用getData,想取出type就用getType。
--结束END--
本文标题: 萌新Android笔记----IntentFilter匹配篇
本文链接: https://lsjlt.com/news/29238.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0