Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Create an empty intent.
|
|||||||||||
Copy constructor.
|
|||||||||||
Create an intent with a given action.
|
|||||||||||
action, Uri uri) Create an intent with a given action and for a given data url.
|
|||||||||||
packageContext, Class<?> cls) Create an intent for a specific component.
|
|||||||||||
action, Uri uri, Context packageContext, Class<?> cls) Create an intent for a specific component with a specified action and data.
|
Component属性(显式Intent):
Intent的Component属性需要接收一个ComponentName对象,ComponentName对象包含如下构造器(指定包名和类名)可唯一确定一个组件类,指定了该属性的Intent称为显式Intent,没有指定Component属性的Intent称为隐式Intent,应用会根据Intent指定的规则去启动符合条件的组件:
ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件
ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件
ComponentName(Context pkg,Class<?> cls):创建pkg所对应的包下的cls类所对应的组件。
初次之外Intent还包含如下三个方法:
setClass(Context packageContext,Class<?> cls):设置Intent将要启动的组件对应的类
setClassName(Context packageContext,String className):设置Intent将要启动的组件对应的类名
setClassName(String packageName,String className):设置该Intent将要启动的组件对应的类名
核心代码:
FirstActivity:
ComponentName comp = new ComponentName(ComponentAttr.this,SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);
SecondActivity:
ComponentName comp = getIntent().getComponent();
show.setText(“组件包名为:“+comp.getPackageName() +"组件类名为:"+comp.getClassName());
Action,Category属性与intent-filter配置(隐式Intent):
Intent的Action,Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象”动作“,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用。
到底程序会启动哪个Activity?取决于Activity配置中的<intent-filter.../>元素的配置。<intent-filter.../>元素是<activity.../>元素的子元素,该元素用于配置Activity所能响应的Intent。
<intent-filter.../>元素通常可包含如下子元素:
0~N个<action.../>子元素
0~N个<category.../>子元素
0~1个<data.../>子元素
该元素也是<service.../>,<receiver.../>元素的子元素,用于表明它们可以相应的Intent。
核心代码:
FirstActivity:
Intent intent = new Intent();
intent.setAction("com.coslay.intent.action.SomeThing");
SecondActivity:
// 获取该Activity对应的Intent的Action属性
String action = getIntent().getAction();
AndroidManifest.xml:
<activity android:name=".SecondActivity"
android:label="@string/app_name">
<intent-filter>
<!-- 指定该Activity能响应Action为指定字符串的Intent -->
<action android:name="com.coslay.intent.action.SomeThing" />
<!-- 指定该Activity能响应Action属性为helloWorld的Intent -->
<action android:name="com.coslay.intent.category.SomeThing" />
<!-- 指定该Action能响应Category属性为指定字符串的Intent -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
代码说明:
一个Intent对象最多只能包括一个Action属性,但一个Intent对象可以包含多个Category属性( 通过intent.addCategory(String);增加)。当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。
指定Action、Category调用系统Activity:
主要代码:
Activity:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 为bn按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 创建Intent
Intent intent = new Intent();
//设置Intent的Action属性
intent.setAction(Intent.ACTION_GET_CONTENT);
//设置Intent的Type属性
intent.setType("vnd.android.cursor.item/phone");
// 启动Activity,并希望获取该Activity的结果
startActivityForResult(intent, PICK_CONTACT);
}
});
}
@Override
public void onActivityResult(int requestCode
, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
case (PICK_CONTACT):
if (resultCode == Activity.RESULT_OK)
{
...
}
break;
}
}
另一个例子:
Activity:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent对象
Intent intent = new Intent();
// 为Intent设置Action、Category属性
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
});
}
Data、Type属性与intent-filter配置
Data属性通常用于向Action属性提供操作的数据。Data属性接收一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示:
content://com.android.contacts/contacts/1
格式:scheme://host:port/path
Type属性用于指定该Data所指定Uri对应的MIME类型,这种MINE类型可以是任何自定义的MINE类型,只要符合abc/xyz格式的字符串即可。
Data属性与Type属性设置如下:
如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性
如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性
如果希望Intent既有Data属性,也有Type属性,应该调用Intent的setDataAndType()方法
在AndroidManifest.xml文件中为组件声明Data,Type属性都通过<data.../>元素,<data.../>元素的格式如下:
<data android:mineType="" 用于声明该组件所匹配的Intent的Type属性
android:scheme="" 用于声明该组件所能匹配的Intent的Data属性的scheme部分
android:host="" ...host部分
android:port="" ...port部分
android:path="" ...path部分
android:pathPrefix="" ...path前缀
android:pathPattern="" /> ...path字符串模板
Intent的Type属性必须对应组件中<intent-filter.../>元素中<data.../>子元素的mimeType属性与此相同,才能启动该组件。
Intent的Data属性并不需要启动组件的<intent-filter.../>中额<data.../>的4个属性值完全相同。匹配规则如下:
如果目标组件的<data.../>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scehme部分部分...与android:scehme属性值相同,即可启动该组件
如果目标组件的<data.../>子元素只指定了android:scheme、android:host属性,那么只要Intent的Data属性的scheme、host部分与android:scheme、android:host属性值相同,即可启动该组件
如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:port属性,那么要求Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:port属性值相同,即可启动该组件
如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:path属性,那么只要Intent的Data属性的scheme、host、path部分与android:scheme、android:host、android:path属性值相同,即可启动该组件
如果目标组件的<data.../>子元素指定了android:scheme、android:port、android:host、android:path属性,那么就要求Intent的Data属性的scheme、host、port、path依次与android:scheme、android:host、android:port、android:path属性值相同才可以启动该组件
注意:
配置Activity的<intent-filter.../>元素时,<action.../>子元素的name属性是随意指定的,这是必需的。如果希望<data.../>子元素能正常起作用,至少要配置一个<action.../>子元素,但该元素的android:name属性值可以是任意的字符串
核心代码:
AndroidManifest.xml:
<activity
android:name=".DataTypeAttr"
android:label="@string/title_activity_data_type_attr">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_scheme"
android:name=".SchemeActivity"
android:label="指定scheme的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data属性的scheme是lee即可启动该Activity -->
<data android:scheme="lee" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_host"
android:name=".SchemeHostPortActivity"
android:label="指定scheme、host、port的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data属性的scheme是lee、且host是www.fkjava.org
、port是8888即可启动该Activity -->
<data
android:scheme="lee"
android:host="www.fkjava.org"
android:port="8888" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_sp"
android:name=".SchemeHostPathActivity"
android:label="指定scheme、host、path的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data属性的scheme是lee、且host是www.fkjava.org
、path是/mypath即可启动该Activity -->
<data
android:scheme="lee"
android:host="www.fkjava.org"
android:path="/mypath" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_path"
android:name=".SchemeHostPortPathActivity"
android:label="指定scheme、host、port、path的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 需要Intent的Data属性的scheme是lee、且host是www.fkjava.org
、port是8888、且path是/mypath才可启动该Activity -->
<data
android:scheme="lee"
android:host="www.fkjava.org"
android:port="8888"
android:path="/mypath"/>
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_type"
android:name=".SchemeHostPortPathTypeActivity"
android:label="指定scheme、host、port、path、type的Activity">
<intent-filter>
<action android:name="xx"/>
<category android:name="android.intent.category.DEFAULT" />
<!-- 需要Intent的Data属性的scheme是lee、且host是www.fkjava.org
、port是8888、且path是/mypath
、且type是abc/xyz才可启动该Activity -->
<data
android:scheme="lee"
android:host="www.fkjava.org"
android:port="8888"
android:path="/mypath"
android:mimeType="abc/xyz"/>
</intent-filter>
</activity>
Activity:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void scheme(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse("lee://www.crazyit.org:1234/test"));
startActivity(intent);
}
public void schemeHostPort(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
startActivity(intent);
}
public void schemeHostPath(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath"));
startActivity(intent);
}
public void schemeHostPortPath(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
startActivity(intent);
}
public void schemeHostPortPathType(View source)
{
Intent intent = new Intent();
// 同时设置Intent的Data、Type属性
intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath")
, "abc/xyz");
startActivity(intent);
}
使用Action、Data属性启动系统Activity:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 为bn按钮添加一个监听器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent
Intent intent = new Intent();
String data = "http://www.crazyit.org";
// 根据指定字符串解析出Uri对象
Uri uri = Uri.parse(data);
// 为Intent设置Action属性
intent.setAction(Intent.ACTION_VIEW);
// 设置Data属性
intent.setData(uri);
startActivity(intent);
}
});
Button edit = (Button) findViewById(R.id.edit);
// 为edit按钮添加一个监听器
edit.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent
Intent intent = new Intent();
// 为Intent设置Action属性(动作为:编辑)
intent.setAction(Intent.ACTION_EDIT);
String data = "content://com.android.contacts/contacts/1";
// 根据指定字符串解析出Uri对象
Uri uri = Uri.parse(data);
// 设置Data属性
intent.setData(uri);
startActivity(intent);
}
});
Button call = (Button) findViewById(R.id.call);
// 为edit按钮添加一个监听器
call.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent
Intent intent = new Intent();
// 为Intent设置Action属性(动作为:拨号)
intent.setAction(Intent.ACTION_DIAL);
String data = "tel:13800138000";
// 根据指定字符串解析出Uri对象
Uri uri = Uri.parse(data);
// 设置Data属性
intent.setData(uri);
startActivity(intent);
}
});
}
Extra属性:
Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,它可以存入多组key-value对,这样可以通过Intent在不同Activity之间进行数据交换了。
Flag属性:
Intent的Flag属性用于为该Intent增加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent增加控制旗标。
参考:http://developer.android.com/reference/android/content/Intent.html
http://blog.csdn.net/coslay/article/details/20698421
Intent过滤器过滤流程图: