Android学习(三)Intent

Intent是一个动作的完整描述,包含了产生组件、接收组件和传递数据信息。Android中提供了Intent机制来协助应用间的交互与通讯Intent不仅可用于应用程序之间,也可用于应用程序内部 的 Activity / Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

Intent由动作、数据、分类、类型、组件和扩展信息等内容组成

Action属性用于描述Intent要完成的动作:

Data属性是执行动作的URI和MIME类型(执行的目标对象) 

Action和data一般匹配使用(这两个属性是最重要的): 

Category属性指明一个执行Action的分类(。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。):

Component属性用于指明Intent目标组件的类名称

通常(隐式)intent是根据Intent中包含的其他属性的信息,比如Action、Data/Type、Category进行查找,最终找到一个与之匹配的目标组件。但是,如果指定了Component这个属性(显式),Intent则会 直接根据组件名查找到相应的组件,而不再执行上述查找过程。指定Component属性后, Intent的其他属性都是可选的。

Extra属性用于添加一些附加信息:例如发送一个邮件,就可以通过Extra属性来添加主题 (subject)和内容(body)。这边putExtra()一些信息就可以被在那边用getExtra()取出。

根据Intent寻找目标组件时所采用的方式不同,可以将Intent分为两类:直接Intent和间接 Intent。又称为显式Intent与隐式Intent 。

显式intent:

一般就是已知组件名

 

直接传递到构造函数或者用set方法设置。

隐式intent(一般选择此方式):

隐式Intent,不指定具体的组件,但是它会声明将要执行的操作,从而匹配到相应的组件。这种方式通过Intent Filter过滤实现,过滤时通常根据Action、Data和Category属性进行匹配查找。 Android提供了两种生成Intent Filter的方式:一种是通过IntentFilter类生成;另一种通过在配置文件 AndroidManifest.xml中定义元素生成。

匹配原则:

<intent-filter>标签中常用<action>、<data>和<category>这些子元素(其实就是表明所处的activity的属性或是能力,如果和程序中所需intent目标组件匹配则可以将其使用

其中<action>属性不能为空,否则所有的Intent都会因匹配失败而被阻塞。

当发送一个隐式Intent后,系统会将它与设备中的每一个组件的过滤器进行匹配,匹配属性有Action、 Category、Data三个需要这三个属性都匹配成功才能唤起相应的组件。

过滤器中有多个action项时,隐式Intent中的Action属性,与组件中的某一个过滤器的Action能够匹配(如果一个过滤器声明了多个 Action属性,只需要匹配其中一个就行,就已经说明能满足要求了),那么就算是匹配成功.

过滤器中有多个category项时,过滤器的Category属性内容必须是大于或者等于隐式Intent的Category属性时候,隐 式Intent才能匹配成功。如果一个隐式Intent没有设置Category属性,那么它可以通过任何一个过滤器 的Category匹配。

过滤器中有多个data项时,用于指定组件可以执行的数据。每个Data属性都可以指定数据的URI结构(数据地址)和数据MIME类型(数据类型)。

Data匹配时候,MIME类型和URI两者都会进行匹配,匹配规则如下:

如果过滤器未声明URI和MIME类型,则只有不含URI和MIME类型的隐形Intent才能 匹配成功

如果过滤器中声明URI但是未声明MIME类型(也不能从URI中分析出MIME类型), 则只有URI与过滤器URI相同且不包含MIME类型的隐式Intent才能匹配成功

如果过滤器声明MIME类型但是未声明URI,只有包含相同MIME类型但是不包含URI 的隐式Intent才能匹配成功

如果过滤器声明了URI和MIME类型(既可以是直接设置,也可以是从URI分析出来) ,只有包含相同的URI和MIME类型的隐式Intent才能匹配成功

总结一下就是:基本隐式intent和intentfilter的这URI和MIME两个属性无论可知未知哪个都必须一模一样。

URI匹配原则:

Uri基本结构:

[scheme:][//authority][path][?query][#fragment]   authority还可以细分为host和port

[scheme:][//host:port][path][?query][#fragment]  

在URI中,每个组成部分都是可选的,但是有线性的依赖关系 ①如果没有scheme部分,那么host部分会被忽略 ②如果没有host部分,那么port部分会被忽略 ③如果host部分和port部分都没有,那么path部分会被忽略 当进行URI匹配时候,并不是比较全部,而是局部对比,以下是URI匹配规则。 ①如果一个URI仅声明了scheme部分,那么所有拥有与其相同的scheme的URI都会通过 匹配,其他部分不做匹配 ②如果一个URI声明了scheme部分和authority部分,那么拥有与其相同scheme和 authority的URI才能匹配成功,path部分不做匹配 ③如果一个URI所有的部分都声明了,那么只有所有部分都相同的URI才能匹配成功

 实例:

在Android世界的四大组件Activity、BroadcastReceiver、Service、Content Provider中,前三个都是 通过Intent来解析进行跳转的,Intent可以说是连接这四大组件的重要桥梁。

先学习intent实现三种activity跳转:

不带参跳转:

Intent intent = new Intent(xxx.this(当前环境activity),xxx.class(目标activity));

startActivity(intent);

带参数跳转:

其实就是以键值对形式往在startActivity前往intet里面putExtra(键,值)

目标activity中直接getIntent().getExtra(键)。

 

带返回值的跳转:

在跳转的Activity端,调用 startActivityForResult(intent, 1),跳转到 下一个Activity,其中第一个参数为传入的意图对象(里面封装了目的activity类和其余信息),第二个为设置的请求码

 

跳转到第二个Activity后,调用 setResult(100, intent)方法可返回上一个 Activity,其中第一个参数为结果码,第二 个为传入的意图对象;

 

在第一个Activity通过onActivityResult()方 法获得返回的数据 得先判断是否是自己的那个请求以及请求的结果是否同意:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值