Intent意为意图,是Android程序中各组件之间进行交互的一种重要方式,是对要执行的操作的抽象描述,经常用来启动Activity、启动service与后台服务沟通,也可以broadcastIntent发送给感兴趣的broadcastreceiver组件。下面对Intent的具体用法作以介绍。
一、Intent Structure
Intent有以下几个基本属性:
(1)action--是指Intent将要完成的动作,可以是一段字符串常量。可以使用系统定义的,也可以自己定义,一般来说, 自定义的action应该以application的包名作为前缀, 然后附加特定的大写字符串,比如"com.example.activitytest.ACTION_START",可以使用setAction()方法设定(2)action,getAction()方法获取action,但每个Intent只允许存在一个action。
data--用于指定当前Intent正在操作的数据,经常与action配合使用,这些数据通常是由字符串经过Uri.parse()方法解析出来的uri对象。并且一个intent只允许有一个data。举个例子:
Intent intent=new Intent(Intent.ACTION_VIEW);//Android内置Action
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
就会调用系统浏览器打开百度主页。 另外,我们还可以在<intent-filter>标签中配置<data>标签,用于精确地指出当前活动能够响应什么类型的数据,<data>标签主要可以配置以下内容:
1、android:scheme 用于指定数据的协议部分,如上面的http部分
2、android:host 用于指定数据的主机部分,如www.baidu.com
3、android:port 用于指定数据的端口部分,一般在主机名之后
4、android:path 用于指定主机名和端口之后的部分,如网址中跟在域名之后的内容
5、android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定
只有<data>标签中指定的内容和Intent中携带的data完全一致时,当前活动在可以响应该intent
(3)category--这一属性也是一个字符串,给出了关于action操作的附加信息。intent可以有任意多个category。用于指定目标组件需要满足的额外条件。可以使用addCategory()方法为intent添加category属性,getCategories()用于获取intent中封装的所有category。Intent类中有一些预定义的部分category:
CATEGORY_HOME:表示目标activity必须是一个显示homescreen的activity
CATEGORY_LAUNCHER--表示目标activity可以作为task栈中的初始activity,常与ACTION_MAIN配合使用
CATEGORY_GADGET--表示目标activity可以被作为另一个activity的一部分嵌入
(4)Type--Type属性显示指定intent的数据类型(MIME),一般intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
(5)Component--这一属性指定intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。可以使用setComponent(ComponentNamecomp)设置该intent的component属性。比如:
ComponentName comp =new ComponentName(FirstActivity。this,SecondActivity。class);
Intent intent = newIntent();
intent.setComponent(comp);
以上创建intent的方式等同于我们日常用的Intent intent = newIntent(FirstActivity.this,SecondActivity.class);
(6)Extra--通过Intent启动一个component时, 经常需要携带一些额外的数据过去。携带数据需要调用Intent的putExtra()方法, 该方法存在多个重载方法, 可用于携带基本数据类型及其数组, String类型及其数组, Serializable类型及其数组,Parcelable类型及其数组, Bundle类型等。Serializable和Parcelable类型代表一个可序列化的对象, Bundle与Map类似,可用于存储键值对。
(7)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来源于后台操作, 而非用户的直接选择。