概述
各主件之间通信的意图(通信的信息)
Android意图是一个要执行的操作的抽象描述。
Android核心组件:Activity、Service、BroadcastReceiver彼此是独立的,它们之所以可以互相调用、协调工作,最终形成一个具有一定功能的Android应用,主要是通过Intent对象协助来完成。
Intent起着媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
活动跳转
- Activity的跳转
- 包括
- 显式:确指定了要激活的组件是哪个组件(用于连接应用程序的内部世界)
- 隐式:通过在清单文件中配置IntentFilter来实现的(用于激活其他应用程序的组件)
- 作用逻辑:让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。
优点 | 缺点 | |
---|---|---|
显式意图 | 效率高 | 耦合度高:(直接指定激活组件名称) |
隐式意图 | 降低程序的耦合度 | 效率低:(系统都会搜索所有可用的intentfilter进行匹配) |
隐式意图:
当一个意图对象被一个意图过滤器进行匹配测试时,会有三个方面会被参考到:
-
动作测试(Action test)
<action android:name="android.intent.action.VIEW"></action>
-
类别测试(Category test)
<category android:name="android.intent.category.DEFAULT"></category>
-
数据测试(Data test)
<data android:scheme="app" android:host="test"></data>
Intent解析的判断方法
1、如果Intent指明了Action,则目标组件的IntentFilter的Action列表中就必须包含有这个Action,否则不能匹配;
2、如果Intent没有提供Type,系统将从Data中得到数据类型。和Action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配;
3、如果Intent中的数据不是content类型的URI,而且Intent也没有明确指定它的Type类型,将根据Intent中数据的Scheme进行匹配,例如“http:”或“tel:”。同上,Intent的Scheme必须出现在目标组件的Scheme列表中;
4、如果Intent指定了一个或多个Category,这些类别必须全部出现在组件的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
动作(Action)
- 这是意图对象中必须的部分,表现为一个字符串。代表该Intent所要完成的一个抽象“动作”。
- 意图对象中的动作可以通过 setAction() 方法来设置,通过 getAction() 方法来读取
数据(Data)
-
添加数据规格到意图过滤器,用于向Action属性提供操作的数据
- 一个数据类型(如元类型属性)
- 一条 URI
- 或者同时包括数据类型和 URI
setData() 方法只能以 URI 来指定数据,setType() 只能以元类型指定数据
setDataAndType() 可以同时指定 URI 和元类型
URI 通过 getData() 读取,类型通过 getType() 读取。
类别(Category)
类别是意图中可选的部分,是一个字符串,包含该类型组件需要处理的意图的附加信息。addCategory() 方法为意图对象添加类别,removeCategory() 方法删除之前添加的类别,getCategories() 获取所有被设置到意图对象中的类别。
附加数据(Extras)
方法一
这是传递给需要处理意图的组件的以键值对描述的附加信息。通过 putExtra() 方法设置,getExtra() 方法读取
putExtras(Stringname, Xxx data):其中Xxx表示数据类型,向Intent中放入Xxx类型的数据,例如int、long、String等
方法二
putExtras(Bundle data)方法,该方法可用于存放一个数据包
Bundle:
- 类似于Java中的Map对象,存放的是键值对的集合,可把多个相关数据放入同一个Bundle中
- 一系列的存入数据的方法,方法格式为putXxx(Stringkey, Xxx data),向Bundle中放入int、long等各种类型的数据
- getXxx(Stringkey)方法,从Bundle中取出各种类型的数据