`
qilixiang012
  • 浏览: 202951 次
文章分类
社区版块
存档分类
最新评论

Intent 属性的作用

 
阅读更多
Public Constructors
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent()">Intent</a></span>()</nobr>
Create an empty intent.
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent(android.content.Intent)">Intent</a></span>(<a target="_blank" href="/reference/android/content/Intent.html">Intent</a> o)</nobr>
Copy constructor.
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent(java.lang.String)">Intent</a></span>(<a target="_blank" href="/reference/java/lang/String.html">String</a> action)</nobr>
Create an intent with a given action.
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent(java.lang.String,%20android.net.Uri)">Intent</a></span>(<a target="_blank" href="/reference/java/lang/String.html">String</a> action, <a target="_blank" href="/reference/android/net/Uri.html">Uri</a> uri)</nobr>
Create an intent with a given action and for a given data url.
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent(android.content.Context,%20java.lang.Class&lt;?&gt;)">Intent</a></span>(<a target="_blank" href="/reference/android/content/Context.html">Context</a> packageContext, <a target="_blank" href="/reference/java/lang/Class.html">Class</a>&lt;?&gt; cls)</nobr>
Create an intent for a specific component.
<nobr></nobr> <nobr><span class="sympad"><a target="_blank" href="/reference/android/content/Intent.html#Intent(java.lang.String,%20android.net.Uri,%20android.content.Context,%20java.lang.Class&lt;?&gt;)">Intent</a></span>(<a target="_blank" href="/reference/java/lang/String.html">String</a> action, <a target="_blank" href="/reference/android/net/Uri.html">Uri</a> uri, <a target="_blank" href="/reference/android/content/Context.html"> Context</a> packageContext, <a target="_blank" href="/reference/java/lang/Class.html"> Class</a>&lt;?&gt; cls)</nobr>
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:hostandroid:port属性,那么要求Intent的Data属性的scheme、host、port部分与android:scheme、android:hostandroid:port属性值相同,即可启动该组件

如果目标组件的<data.../>子元素指定了android:scheme、android:hostandroid:path属性那么只要Intent的Data属性的scheme、host、path部分与android:scheme、android:host、android:path属性值相同,即可启动该组件

如果目标组件的<data.../>子元素指定了android:scheme、android:port、android:hostandroid:path属性,那么就要求Intent的Data属性的scheme、host、port、path依次与android:scheme、android:host、android:portandroid: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过滤器过滤流程图:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics