转至:http://blog.csdn.net/zhaofangyuan/article/details/7962429
转至:https://liuzhichao.com/p/506.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
Intent用于启动Activity,Service,以及BroadcastReceiver三种组件,同时还是组件之间通信的重要媒介。
使用Intent启动组件的优势
1, Intent为组件的启动提供了一致的编程模型。无论想要启动的组件是Activity,Service,还是BroadcastReceiver,都可以使用Intent封装启动的意图。
2, 在某些时候,应用程序只是想启动具有某种特征的组件,并不想和某个特定的组件耦合。使用Intent可以方便的达到这种高层次解耦的目的。
Intent的Component属性
Intent对象的setComponent(ComponentNamecomp)方法用于设置Intent的Component属性。ComponentName包含如下几个构造器:
ComponentName(Stringpkg, String cls)
ComponentName(Contextpkg, String cls)
ComponentName(Contextpkg, Class<?> cls)
由以上的构造器可知,创建一个ComponentName对象需要指定包名和类名--这就可以唯一确定一个组件类,这样应用程序即可根据给定的组件类去启动特定的组件。例如:
ComponentName comp =new ComponentName(FirstActivity。this,SecondActivity。class);
Intent intent = newIntent();
intent。setComponent(comp);
以上三句代码创建了一个intent对象,并为其指定了Component属性,完全等价于下面的代码:
Intent intent = newIntent(FirstActivity。this,SecondActivity。class);
除了使用setComponent()之外,还可以使用setClass(),setClassName()来显式指定目标组件,还可以调用getComponent()方法获得Intent中封装的ComponentName对象。
当程序采用这种形式启动组件时,在Intent中明确的指定了待启动的组件类,此时的Intent属于显式intent,显式Intent应用场合比较狭窄,多用于启动本应用中的component,因为这种方式需要提前获知目标组件类的全限定名。而隐式Intent则通过Intent中的action,category, data属性指定目标组件需要满足的若干条件,系统筛选出满足所有条件的component,从中选择最合适的component或者由用户选择一个component作为目标组件启动。
如果Intent中指定了ComponentName属性,则Intent的其他属性将被忽略。
Intent的Action属性
action属性是一个字符串,代表某一种特定的动作。 Intent类预定义了一些action常量,开发者也可以自定义action。一般来说,自定义的action应该以application的包名作为前缀,然后附加特定的大写字符串,例如"cn。xing。upload。action。UPLOAD_COMPLETE"就是一个命名良好的action。
Intent类的setAction()方法用于设定action,getAction()方法可以获取Intent中封装的action。
以下是Intent类中预定义的部分action:
ACTION_CALL--目标组件为activity,代表拨号动作;
ACTION_EDIT--目标组件为activity,代表向用户显示数据以供其编辑的动作;
ACTION_MAIN--目标组件为activity,表示作为task中的初始activity启动;
ACTION_BATTERY_LOW--目标组件为broadcastReceiver,提醒手机电量过低;
ACTION_SCREEN_ON--目标组件为broadcast,表示开启屏幕。
Intent的Category属性
category属性也是一个字符串,用于指定一些目标组件需要满足的额外条件。 Intent对象中可以包含任意多个category属性。 Intent类也预定义了一些category常量,开发者也可以自定义category属性。
Intent类的addCategory()方法为Intent添加Category属性,getCategories()方法用于获取Intent中封装的所有category。
以下是Intent类中预定义的部分category:
CATEGORY_HOME--表示目标activity必须是一个显示homescreen的activity;
CATEGORY_LAUNCHER--表示目标activity可以作为task栈中的初始activity,常与ACTION_MAIN配合使用;
CATEGORY_GADGET--表示目标activity可以被作为另一个activity的一部分嵌入。
Intent的Data属性
data属性指定所操作数据的URI。 data经常与action配合使用,如果action为ACTION_EDIT,data的值应该指明被编辑文档的URI;如果
action为ACTION_CALL,data的值应该是一个以"tel:"开头并在其后附加号码的URI;如果action为ACTION_VIEW,data的值应该是一个以"http:"开头并在其后附加网址的URI。。。
Intent类的setData()方法用于设置data属性,setType()方法用于设置data的MIME类型,setDataAndType()方法可以同时设定两者。可以通过getData()方法获取data属性的值,通过getType()方法获取data的MIME类型。
Intent的Extra属性
通过Intent启动一个component时,经常需要携带一些额外的数据过去。携带数据需要调用Intent的putExtra()方法,该方法存在多个重载方法,可用于携带基本数据类型及其数组, String类型及其数组, Serializable类型及其数组,Parcelable类型及其数组, Bundle类型等。Serializable和Parcelable类型代表一个可序列化的对象, Bundle与Map类似,可用于存储键值对。
Intent的Flag属性
flag属性是一个int值,用于通知android系统如何启动目标activity,或者启动目标activity之后应该采取怎样的后续操作。所有的flag都在Intent类中定义,部分常用flag如下:
FLAG_ACTIVITY_NEW_TASK--通知系统将目标activity作为一个新task的初始activity;
FLAG_ACTIVITY_NO_HISTORY--通知系统不要将目标activity放入历史栈中;
FLAG_FROM_BACKGROUND--通知系统这个Intent来源于后台操作,而非用户的直接选择。。。
IntentFilter实际上相当于Intent的过滤器,一个应用程序开发完成后,需要告诉Android系统自己能够处理哪些隐形的Intent请求,这就需要声明IntentFilter。IntentFilter的使用方法实际上非常简单,仅声明该应用程序接收什么样的Intent请求即可。
IntentFilter过滤Intent时,一般是通过Action、Data及Category三方面进行监测的。接下来分别对这三方面进行介绍。
一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足即可完成Action验证。当IntentFilter中没有说明任何一个Action时,那么任何的Action都不会与之匹配。而如果Intent中没有包含任何Action,那么只要IntentFilter中含有Action时,便会匹配成功。
数据的监测主要包含两部分,即数据的URI及数据类型,而数据URI又被分成三部分进行匹配(scheme、authority、path),只有这些全部匹配时,Data的验证才会成功。
IntentFilter同样可以设置多个Category,当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category的检查,而其他的Category并不受影响。但是当IntentFilter没有设置Category时,只能与没有设置Category的Intent相匹配。