Intent
Intent的作用
- 用于启动一个Activity,Service,BroadcastReceiver组件
- 用于被启动组件之间的信息交换(例如两个Activity可以把交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象.)
Intent的属性
Component属性
Intent的Component的属性接受一个ComponentName对象.
ComponentName需要指定包名和类名.
//ManinActivity.java中为按键绑定的监听器
ComponentName comp = new ComponentName(ManinActivity,this, SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);
指定Component属性的Intent明确它要启动哪个组件,因此这种Intent被称为显式Intent;
没有指定Component属性的Intent被称为隐式Intent.
Action属性和Category属性
- Action属性代表代表该Intent所要完成的一个抽象动作;
Category属性代表为Action增加额外的附加类别消息,Action属性和Category属性经常结合使用. - 由于是隐式Intent,从代码中无法看出下面程序要去启动哪个Activity.因此,需要启动哪个Activity取决于Activity配置中<intent-filter>.
//ManinActivity.java中为按键绑定的监听器
Intent intent = new Intent();
intent.setAction(MainActivity.CRAZYIT_ACTION);
intent.addCategory(MainActivity.CRAZYIT_CATEGORY);
startActivity(intent)
因此被启动的目标Activity中的配置文件中应该有如下信息:
//AndroidManifest.xml配置文件中SecondActivity的配置信息
//上面代码的MainActivity的路径是在\org\crazyit\intent\MainActivity.java
<activity android:name=".SecondActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="org.crazyit.intent.action.CRAZYIT_ACTION" />
<category android:name="org.crazyit.intent.category.CRAZYIT_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
< /intent-filter>
< /activity>
==说明==
- <inter-filter .../>元素是AndroidManifest.xml文件中<activity .../>元素的子元素,<activity .../>为应用程序配置Activity,<inter-filter .../>配置该Activity所能相应的Intent.
-
<intent-filter .../>元素中可以包含以下子元素:
- 0-N个<action .../>子元素
- 0-N个<category .../>子元素
- 0-1个<data .../>子元素
- <intent-filter .../>也可以时<service .../>和<receiver .../>的子元素
- 一个Intent对象最多只能包括一个Action属性,通过setAction(String str)方法来设置属性;一个Intent对象可以包括多个Category属性,通过调用addCategory(String str)方法来添加属性.
- 因为程序创建一个Intent时,该Intent会默认启动Category的属性值Intent.CATEGORY_DEFAULT(常量值为android.intent.category.DEFAULT)常量的组件,所以在被启动的Activity中的配置文件中需要添加:
<category android:name="android.intent.category.DEFAULT" />
- 注意:在AndroidManifest.xm文件中的<intent-filter .../>下可以有多个<action .../>,但是在XXXActivity.java中只能设置一个Action属性,可以有多个Category属性.
- Intent对象不仅可以启动应用程序自身内的组件,还可以启动其他应用程序的组件和系统自带的程序的组件.
Data属性和Type属性
-
Data属性用于向Action属性提供操作的数据,接受一个Uri对象.
- Uri对象通常是如下形式的字符串:
schem://host:port/path
例如:
content://www.baidu.com:88/test
,content是schem部分;www.baidu.com是host部分;88是port部分;test是path部分.
- Uri对象通常是如下形式的字符串:
- Type属性用于指定该Data属性指定Uri对应的MIME类型,只要符合abc/xyz格式的字符串即可.
-
Data属性与Type属性的关系:
- 如果Intent先设置Data属性,后设置Type属性,那么Type属性会覆盖Data属性
- 如果Intent先设置Type属性,后设置Data属性,那么Data属性会覆盖Type属性
- 如果希望Intent既有Data属性又有Type属性,可以调用setDataAndType()方法.
-
在AndroidManifest.xml文件中为组件声明Data,Type属性通过<data .../>元素,格式如下:
- mimeType:该组件所匹配的Intent的Type属性;
- scheme:该组件所匹配的Intent的Data属性的scheme部分;
- host:该组件所匹配的Intent的Data属性的host部分;
- port:该组件所匹配的Intent的Data属性的port部分;
- path:该组件所匹配的Intent的Data属性的path部分;
- pathPrefix:该组件所匹配的Intent的Data属性的path前缀;
- pathPattern:该组件所匹配的Intent的Data属性的path字符串模板
<data android:mimeType=""
android:scheme=""
android:host=""
android:port=""
android:path=""
android:pathPrefix=""
android:pathPattern=""
/>
-
==说明==:
- 至于Type属性: XXXActivity中Intent通过setType()设置的Type属性 和 AndroidManifest.xm中被启动Activity的<intent-filter .../>元素的<data .../>子元素的mimeType属性完全相同.
至于Data属性: 由于Uri对象可以分为schem,host,port,path部分, 因此不需要与被启动组件的<intent-filter .../>中<data .../>子元素的android:schem,android:host,android:port,android:path完全满足.
- 如果被启动组件B的<data .../>中只指定了android:scheme属性,那么只要组件A中Intent的Data属性的scheme部分与其相同,就可以启动组件B.
- 同理,也可以只指定android:scheme和android:host;
- 也可以只指定android:scheme,android:host和android:port;
- 也可以只指定android:scheme,android:host和android:path;
- 也可以指定android:scheme,android:host,android:port和android:path;
- 但是不能只有android:port没有android:host;也不能只有android:path没有android:host
- 如果希望<data .../>下的子元素能正常起作用.必须配置一个<action .../>子元素,不过<action .../>的android:name可以时任意的字符串.
//MainActivity.java
Intent intent = new Intent();
String data = "http://wwww.crazyit.org";
Uri uri = Uri.parse(data);
// intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
//对应的被启动Activity的AndroidManifest.xml文件
<activity
android:icon="drawable/ic_type"
android:name="SecondActivity"
<intent-filter>
<action android:name="xxx"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:scheme="http"
/*可以省略*/
android:host="www.crazyit.org"
/>
</intent-filter>
/activity>
Extra属性
该属性用于多个Action之间的数据交流,其属性值应该是一个Bundle对象,可以通过Intent在不同Activity之间进行数据交换,
Flag属性
该属性用于为对应的Intent添加一些额外的控制标识,可以调用intent 的addFlags()方法添加控制标识.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。