Intent可以理解是Android不同组件之间的媒介或者是信使,起着通信的作用,这样四大组件之间的耦合就不是特别多,系统可扩展性就比较强比较健壮。
我们可以设想,一个机器人由activity,service,broadcast,contentProvider构成,如果紧密拼凑在一起根本无法“奔跑”,那么现在我们有了Intent,可以理解成机器人的关节,
这样就沟通了四大组件,机器人就能奔跑啦。(包括binder机制,这种c/s结构一定程度上都是为了解耦)
还可以和浏览器的url类比,客户端和服务器之间是通过发送uri来相互通信的,这种松散的网络拓扑就会很健壮,便于共享服务器资源和网络的扩展。
那么常见的Intent的使用是启动Activity,Service,Broadcasst.
组件名称 |
方法名称 |
Activity |
startActivity() startActivityForResult() |
Service |
startService() bindService() |
Broadcasts |
sendBroadcast() sendOrderedBroadcast() sendStickyBroadcast() |
Intent在寻找目标组件的时候有两种方式。一为显示调用,通过Component name来直接指定,如startActivity(intent);二位隐式调用,没有明确指定目标组件的名称,通过一定的条件过滤筛选,如setAction
那么重点来了,Intent对象是由哪些部分构成呢,由一下六个部分构成:Component name,Action,Data,Category,Extras,Flags.Intent可以任选其中的几项来构造,主要是看intent的用途而定。(Intent实质是一系列传输信息类型的集合)
1.Component name
Component name就是组件名称,是要处理这个Intent对象的组件名称。
组件名称对象由ComponentName类来封装,组件名称包含包名称和类名称,被声明在AndroidManifest.xml文件中。
组件名称通过setComponent(),setClass(),setClassName()设置,通过getComponent()获取。
需要注意的是Component name是一个可选项,如果被设置,那么Intent对象就显式指定了要转向的组件,如果没有被设置,则Intent对象需要根据其他信息进行筛选查找。
2.Data
数据类型也可以显式指定,比如setData()方法指定数据为URI,setType() 指定为MIME type,setDataAndType() 指定它既为URI又为MIME type。读取的时候URI用getData(),MIME type用getType()。
3.Category
与category相应的方法有添加addCategory()、移除removeCategory() 和获取所有category getCategories() 。
常见的Category常量有:CATEGORY_BROWSABLE ,CATEGORY_GADGET,CATEGORY_HOME,CATEGORY_LAUNCHER,CATEGORY_PROFERENCE.
Category指定的往往是一些控件。
4.Extras
实际上,数据可以被作为一个Bundle对象被使用,利用 putExtras() 和 getExtras() 方法。我们可以看出bundle实质上是hashmap,存储一些键值;然后传递这些键值的信息。
public Bundle() {
mMap = new HashMap<String, Object>();
mClassLoader = getClass().getClassLoader();
}
5.Flags
各种类型的Flag。很多是用来指定Android系统如何启动activity,还有启动了activity后如何对待它。所有这些都定义在Intent类中。
6.Action
Action是指Intent要完成的动作,是一个字符串常量。
Intent类中有很多预定义的常量,为了一些通常的动作;还有一些定义在Android API的其他地方。
也可以自己定义Action常量,自定义的常量需要加上你的应用的包名作为前缀。
Action在很大程度上决定了Intent的其他部分是如何构造的,尤其是 data 和 extras域。(就好像函数名会决定着参数值和返回值一样。)所以Action的名字应该尽可能具体,并且它们应该和Intent中的其他域紧密结合。
使用 setAction() 和 getAction()来设置和读取Action属性。
常见的Action包括:ACTION_CALL,ACTION_EDIT,ACTION_MAIN,ACTION_SYNC,ACTION_BATTERY_LOW,
ACTION_HEADSET_PLUG,ACTION_SCREEN_ON,ACTION_TIMEZONE_CHANGED.
Action指向的往往是android的系统服务相关的,如系统service,broadcast之类的系统服务。