Intent的那些些事儿

  请原谅我用这么文艺的标题来阐释一颗无时无刻奔腾着的2B青年的心。可是今天要介绍的Intent绝不2B,甚至在我看来,或许还有些许飘逸的味道,至于飘逸在哪里呢?那我们就好好来剖析剖析Intent和它的好搭档IntentFilter的基友情。

开场告白

  Intent在Android大家庭中是一个活泼的小男孩,从小就是交际草。在代码中,Activity、Service、BroadcastReceiver这三个重要的大妈级重量组件,之间的调用关联都是依靠Intent去交流的,例如Activity的startActivity(),Service的startService()、bindService(),BroadcastReceiver的sendBroadcast()、sendOrderBroadcast()等,其中都是需要携带一个Intent(或IntentFilter)的参数。

  当然Intent中要指定要启动组件的信息,或明显活隐晦。明显的就是显式启动:举个例子来说就是Intent你去把这东西交给某某(名字)Activity大妈。隐晦的是隐式启动:当然得不免俗得给例子就是Intent你把这个东东交给昨晚和我一起在菜市场跳广场舞的那个胖大妈,其中广场舞和胖就把某大妈给赤果果的定位了。这就是Intent的两种匹配方式,我都觉得我自己说的怪抽象的了。

  接下来就是介绍IntentFilter的好时机了,它就是大妈的儿子(组件的拦截器)。当如果Intent隐式启动时,Intent会找他的一群小伙伴IntentFilter来,然后问他们说,你们谁的妈昨晚去菜市场跳广场舞了?你们谁的妈又好胖好胖的?然后IntentFilter各想各妈,哎呀,其中一个IntentFilter拍拍脑袋说,这不就是我妈吗!然后他就屁颠屁颠的领着Intent去找某Activity妈把东东交给她了。

  为了避免大家看不懂上面的例子,我还是发扬一下2B青年的社会责任感,用比较教条的语言来介绍一下Intent和IntentFilter:Intent是一个意图对象,组件可以通过设定Intent来启动另外一个组件,有显式启动和隐式启动两种方法,显式启动直接指定要启动的组件的名字,隐式启动则指定action、category、data等来启动符合条件的组件;其中的IntnetFilter就是一个意图过滤器,它会设定一些过滤规则如action、category、data等,如果Intent中的action、category、data与过滤器中相匹配,则为启动该过滤器的组件。

码点代码

  攻城狮的思维就是不见代码不给赞,所以我还是得老老实实得码几个代码出来撑撑场子。但是Intent的显式启动和隐式启动代码度娘一下几大页,在这里再贴上来就对不起人民群众了。所以呢,我就记录点关键代码,如果后面犯失忆了也可以回来侦查一下容易忘的知识。

显式启动Activity、Service:

Intent intent1 = new Intent(getApplicationContext(), MyActivity.class);
startActivity(intent1);//启动Activity组件
startActivityForResult(intent1, 1);//启动有返回的Activity
Intent intent2 = new Intent(getApplicationContext(), MyService.class);
startService(intent2);//启动Service
bindService(intent2, conn, 1);//绑定Service

隐式启动Activity、Service:

Intent intent1 = new Intent();
intent1.setAction("com.net168.test.action.myactivity");
startActivity(intent1);//启动Activity组件
Intent intent2 = new Intent();

intent1.setAction("com.net168.test.action.myservice");
startService(intent2);//启动Service
bindService(intent2, conn, 1);//绑定Service

发送广播:

Intent intent = new Intent();
intent.setAction("com.net168.test.action.mybroadcast");
sendBroadcast(intent);//发送普通广播
sendOrderedBroadcast(intent, null);//发送有序广播

其实很简单,简单得我这的不好意思介绍了。。。

Intent的家世于IntentFilter的纠结

  Intent的背景很复杂,复杂到比一些不入流的HEI社会还复杂些。大体来说,Intent大致包含了Component、Action、Categroy、Data、Type、Extra和Flag这七大金刚(属性),后面我们就好好解释这些大哥大姐们。

Component:它需要接受一个ComponentName的对象,创建一个ComponentName需要指定包名和类名--这就唯一确定了一个组件类,这样程序就可以通过给定的组件类去启动相应的组件;所以我们可以从这里重新给显式启动和隐式启动分个类,一般如果明确指定ComponentName时就是显式启动,反之就是隐式启动。另外我们可以直接在实例化Intent时在构造函数中传入上下文和类名也可以直接帮我们设定了ComponentName,如Intent(this,MyActivity.class),推荐这种方式,比较简洁。

Action:Action要完成一个抽象的动作,但具体由哪个组件来完成则不确定,需要根据IntentFilter来确定组件;在Intent中,Action最多只能有1个,而在IntentFilter中Action可以有多个。这是隐式启动一个组件最基础的属性。

Category:它为Action增加额外的类别信息,因为Action可以启动到多个组件,但是如果往下更详细的分析要启动的组件,可以通过Category来进行拦截;在IntentFilter和Intent中Category可以有多个。任何一个IntentFilter的默认存在一个Intent.CATEGORY_DEFAULT的属性。

Data、Type:这两个算是比较亲的属性。

  Data属性通常用于向Action提供操作的数据,其值为一个Uri对象,Uri对象满足 scheme://host:port/path 的格式,如 content://com.android.contacts/contacts/1,其中content是scheme的部分、com.android.contacts是host的部分、port部分被省略、contacts/1是path的部分。

  Type属性用于指定该Data所指定Uri对应的MIME类型,可以是所以自定义的类型,只要符合abc/xyz格子的字符串即可。

在使用中,我们要知道这两个属性会相互覆盖:如果Intent先设置Data属性,后设置的Type属性将会把Data属性覆盖掉,反之同理。所以如果要设置Data和Type属性的话需要调用Intent的setDataAndType()的方法。

Extra:Extra是用于多量的数据交换,它的对象是一个Bundle对象。

Flag:Flag属性是为了该Intent添加一些额外的控制旗标,可以通过addFlag()添加控制旗标,通常可以通过它来控制Activity的启动效果和启动方式。

这七个属性中,Intent与IntnetFilter匹配的匹配规则在在于Action、Category、data、Type这几个属性中,具体规则如下:

Action的匹配规则:

1、如果Intent中包含action_A,而在IntentFilter中只要存在action_A这个字符串,无论是否还有其他的action_B、action_C,这个Intent都能被IntnetFilter成功匹配。

2、如果如果Intent中包含action_A,只要IntnetFilter中不存在action_A的话,IntentFilter就不能匹配到Intnet。

3、如果Intent中不存在任何action_x,只要IntnetFilter中存在任意一个action_x的话,Filter就能匹配上Intent。

4、如果IntentFilter不存在任何action_x,则无论Intent中无论存在任何action_x或者没有任何action_x的话,两者是完全不能匹配上的。

Category的匹配规则:

  这个匹配关系较为简单,只要Intent中所有category在IntentFilter中都存在,则Intent可以匹配上IntnetFilter,不论此时Intentfilter中还存在其它的category。举个例子,如果Intent中存在category_A、category_B,而Intentfilter中存在category_A、category_B、category_C,则可以匹配;如果而Intentfilter中存在category_A、category_D、category_C,因为Intentf中不存在Intent中存在的category_B,所以匹配失败。

Data和Type的匹配规则:

data由URI来描述和定位,URI由三部分组成,scheme://host:port/path  模式://主机:端口/路径

此外在事件中,还可以设置data的MIME类型,作为事件的datatype属性。

首先明确一个匹配原则,就是对于URI的匹配,只比较IntentFilter中声明的部分。

部分匹配原则:只要IntentFilter中声明的部分匹配成功,就认为整个URI匹配成功。

举例来说,     content://com.silenceburn.SdCardTester:1000/mydata/private/

和IntentFilter定义为  content://com.silenceburn.SdCardTester:1000/     是可以匹配的。

注意IntentFilter中并没有定义path部分,但是依然可以匹配成功,因为IntentFilter不声明的部分不进行比较。

换句话讲,任何符合content://com.silenceburn.SdCardTester:1000/的事件,无论path是什么,都可以匹配成功。

接下来是真正的data部分的,也就是URI的匹配规则如下:

1. 如果data的URI和datatype为空,则 filter 的URI和type也必须为空,才能匹配成功

2. 如果data的URI不为空,但是datatype为空,则 filter 必须定义URI并匹配成功,且type为空,才能匹配成功

3. 如果data的URI为空,但是datatype不为空,则 filter 必须URI为空,定义type并匹配成功,才能匹配成功

4. 如果data的URI和data都不为空,则 filter 的URI和type都必须定义并匹配成功,才能匹配成功。对于URI部分,有一个特殊处理,就是即使IntentFilter没有定义URI,content和file两种URI也作为既存的URI存在。

时间: 2024-08-09 02:17:29

Intent的那些些事儿的相关文章

动漫《那年那兔那些事儿》弹幕爬虫采集数据分析

开启弹幕已经成为很多年轻人看剧时的一种习惯.最近大热的几部电视剧,弹幕也十分精彩有趣,甚至出现“弹幕比剧好看”的现象. ▼ 弹幕的出现消解了观影的孤独感,增加了互动性.可以说,弹幕是对视频作品的二次创作,有趣的弹幕甚至能让一部无聊的视频重焕生机.另一方面,视频创作者也能够从弹幕上看到观众对自己所创作视频的评价,并能够从中汲取有用的信息以便完善自己日后的视频制作. “那年那兔那些事”是以爱国为主旋律的一部国漫,在“抗日神剧”等粗制滥造的国产抗日剧的现状下,因其精良的制作素质和深厚的爱国主义内涵深受

DNS-那些事儿

一.DNS为何物 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53. 二.递归查询和迭代查询的区别 (1)递归查询递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机.如果D

android四大功能组件概要总结

1.activity  某一个activity对应于app中的一个具体的页面.而intent是具些activity都具有的同类型操作的抽象,比如Main View Edit PICK 已及所对应的数据URI.Intent Filters是指定某一具体activity所具有的操作.另外activity之间可以切换,activity可以相互调用并且可以存在返回值 2.broadcast intent receiver是对于app外部事件进行响应,并通过notificationManager完成通知用

论我的ios之路_第1期

无风水面琉璃滑 限我潇潇幽梦长 互把细微显神作 联芳竞秀巧盈盈 夜未央,人未眠,风轻轻的吹,树沙沙的响,来到北京一个多礼拜了,此夜此时,回想起了近些事儿,近些人儿. 初到北京,是美女小麦姐来接我的.小麦姐安排好我到学生宿舍,就回去了,那天天色已晚,然而她说她一个人回去,可以不用担心.其实还是很担心的. 中间花了几天熟悉了周围的环境,日子就到了开课的时间. 无限互联的公司LOGO很漂亮,不得不对设计师点赞! 清一色的苹果笔记本,MacBookpro,我第一次见!简直高大上啊! 初次接触OSX系统,

相关的链接

<!DOCTYPE NETSCAPE-Bookmark-file-1><!-- This is an automatically generated file.It will be read and overwritten.Do Not Edit! --><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmarks

Spring MVC:原理与使用

本人上一篇博文提到了Spring的注入功能,这样在存在对象依赖(具体意思可见上一篇博文)的时候就不用自己生成一个对象了,特别是对于较多的无状态对象的时候,这个特别方便,加上Spring提供的用xml配置文件和代码注解两种方式,使得使用更加灵活.然而spring的功能远不止如此,Spring的强大功能其实还在于做Java后台框架,即Spring MVC,把后台的逻辑和和视图解耦分离,方便使用与扩展,特别是在大型项目中很有用. PS:卖个自己的广告,上一篇博文<Spring注入:配置与注解> (如

中国机器人,请慢些走

前不久,中国最高领导人说:我们不仅要把机器人水平提高上去,而且要尽可能多地占领市场.这句话的方向准确无误,同时,也代表着大大对产业的殷切希望,于是,机器人产业在中国迅速升温,批地.拨款.建工业园区,相关部门好像吃了一粒巨大的伟哥,激情四射,满世界地去咨询,美国佛罗里达大学先进电机中心对这个现象感受颇深,负责人告诉记者:最近几个月他接到的中国企业技术咨询量,是之前的好几倍.中国创业者向来癫狂,之所以容易失去理性通常有两个原因,一是看到别人赚钱了,另一个则是领导说话了,本质上也是钱的问题,毕竟,领导

Intent学习

1.Intent是什么 Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对 应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则 根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组 件,并完成组件的调用. Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service 之间的交互.因此,Intent在这里起着一个中介的作用,专门提供组 件互相调用的相关信息,实现调用者与被调用者之间的解耦. 2

从街边星探到互联网投资者 龌蹉那些事儿已经没有了?

近几日最热闹的就是支付宝圈子上线大尺度照片引起王思聪回复的话题.就如一夜成名天下知.一夜暴富成土豪的"神话"总是让人向往,而能够快速实现这两个愿望的,似乎也就娱乐圈和互联网两个行业了.相比蹿红.暴富"神话"在几十年内都层出不穷的娱乐圈,互联网在近二十年无疑也更具吸引力.不过需要需要注意的是,在一人蹿红.暴富的背后,隐藏的是太多几经挣扎却默默无闻的人,或者龌龊的事情层出不穷. 不管是此前流行的在街边遇到口吐莲花的星探,还是现在一茬接一茬让无数创业者憧憬其带来融资的投资