关于Intent你应该知道的一切

本文主要解释以下问题:

(1)Intent是什么,它的组成以及作用是啥?

(2)Intent匹配机制匹配过程

如果能完整回答这些问题,那么恭喜,你可以跳过此文了。

Intent是什么,它有啥用?

Intent,中文翻译过来就是意图。意图就是要干一件什么事情,比如我要吃饭就是一个意图,它用来传递信息和数据。而在Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成。Intent它贯穿了整个连接过程的始终。它是组件间通讯的载体,它封装了调用组件提供的指令和数据,通过组件管理服务序列化传递给实现组件,由实现组件利用这些信息来完成所需功能。


组件管理服务是什么?

上面介绍Intent时谈到了组件管理服务,那么它是什么呢?它跟Intent之间有什么关系呢?

Android意图机制最核心的设计思想就是引入了组件管理服务作为连接组件的管理者。

该服务可以通过组件的配置信息了解系统中每一个组件的类别和功能,从而帮助调用组件寻找符合需求的实现组件,将调用者与实现者彻底解耦。

在调用组件与实现组件的连接过程中,组件管理服务扮演着调度者的角色。

它从调用组件中接收到Intent对象,然后将该对象与应用管理服务收集到的组件Intent Filter对象进行比较,

从中选出符合调用组件需求的实现组件,最后并调用实现组件对象。组件管理服务是一个系统服务,运行在系统核心进程的独立线程中。

通过进程间通讯机制与各个组件进行交互。


Intent对象的构成


1、Action: Action就是用来表达动作的。比如说“吃”、“做”等。设置Action可以调用Intent.setAction方法为Intent设置一个动作。

例如:

Intent intent=new Intent(); 

intent.setAction(Intent.ACTION_CALL); 

给出打电话的动作。

2、Data:发起请求时,调用组件如果有明确的数据对象,就须设置data项。设置可以通过Intent.setData来设置数据。
例如:

Intent intent=new Intent(); 

intent.setData(Uri.parse("tel:1320010001");
设置了拨打电话的号码。

3、Type:用来描述“我吃菜”这样的特定类别信息的需求。如果data用于特指,那么type就是用于泛指了。在开发中,我们可以通过Intent.setType或者
Intent.setDataAndType来设置Type信息。Type的格式是MIME格式的字符串数据。它可以通过通配符*来表示整个类别的信息。
例如:
image/*或者image/jpg。

4、Category:用于表达的意图有条件约束的情况。例如:“毕业了,去旅行”,要求在毕业的情况下,才去旅行。使用Intent.addCategory的方法来设置。
常见的有:<category android:name="android.intent.category.LAUNCHER" />设置为启动项。

5、Extras:它是Intent中数据传输的载体。它是一个android.os.Bundle对象。该对象按照键值对方式存储数据。它实现了Parcelable接口,可以进行数据的序列化和反序列化,进行进程间传递。它可以传递基本数据类型和实体对象类型。但是是有大小限制的。所以当需要传递体积比较大的数据的时候,还是要谨慎考虑,我觉得可以通过数据库、文件存储等方式来获取,而传输只需传输个id之内的数据就行了。

6、Flags:它是一个整型数,由一系列的标志位汇集而成。
例如:
Intent.FLAG_ACTIVITY_NEW_TASK,标示出在一个新栈中启动一个Activity。


Intent匹配机制以及匹配的比较算法


在意图机制中,组件管理服务负责接收和分析Intent。为调用组件选择最合适的实现组件。

而Intent可以分为两类:
1、精确描述的Intent:设置了Component
2、模糊描述的Intent:没有设置Component

在匹配中,设置了Component的可以直接匹配到相应的组件,无需进行比较。而没有设置Component的就需要进行比较,选出最合适的。
比较是通过组件中的Intent Filter对象中的信息进行匹配计算。

匹配比较的步骤如下:
1、action的比较,如果intent有设置action,而没有设置action的组件就比较失败,其他的就进行action比较,相同则成功,成功进入下一步比较
2、data和type的比较比较逻辑跟action比较一样,不多说了。要注意的是这个data项是采用uri格式的,比较时会将uri信息拆分成Scheme和Authority进行比较。
3、category比较,也同上一样。

从而选出最符合的。

在匹配组件的选择中,Intent Filter 对象可以设置优先级,范围是从-1000到1000的,默认为0。优先级别越高,则越会被选中。
可以使用优先级来达到拦截的目的,例如设置优先级为1000,然后通过广播接收后abortBroadcat()的方法来拦截。

在Android中,也对意图进行了一定的优化,这也是为了提高效率。

主要优化有:
1、索引:组件管理服务会通过哈希表为所有Intent Filter对象的Action、Type等数据项建立索引。
    从而降低了需要比较的Intent Filter的集合规模,提高了速度。
2、缓存:将Intent与Intent Filter的匹配结果记录下来,进行缓存,之后有相同情况直接取缓存中记录。

最后,提一下。在5月29日凌晨,谷歌公司io大会中提到了一个新的功能就是直接通过一个页面来启动本地的应用。

使用是这样子的:



祝大家:工作、学习愉快!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值