- 浏览: 202951 次
文章分类
最新评论
Intent 属性的作用
<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<?>)">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><?> 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<?>)">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><?> 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: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过滤器过滤流程图:
相关推荐
intent属性
关于Action intent的实例,包括自定义的action和系统自带的action。
本代码为博客代码,博客地址:http://blog.csdn.net/zhangjinhuang
有关intentdata和type的介绍及相关实例。
主要实现了对intent属性的一些测试,以及使用intent时的一些注意事项。
Data、Type属性与Intent-filter配置首界面如图4所示,点击“查看图片”可以选择3个符合条件的Activity显示分别以全屏、图5和缩小三个不同的Activity显示图片。
Intent filter 关于Action、Category属性详解源码 对应的博客文章链接: http://blog.csdn.net/a13429921973/article/details/9271973
使用setAction()来设置Action属性,使用getAction()来获得Action属性。既可以使用系统内置的Action,也可以自己定义。系统自定义的action,如ACTION_VIEW, ACTION_EDIT, ACTION_MAIN等等。 1.自定义Action 在“目的...
本文总结讲述了Android常用的intent action功能。分享给大家供大家参考,具体...例如直接调用拨号功能、处理接收短信,诸如此类,都可以通过设置Intent属性来完成。 Intent主要有以下四个重要属性,它们分别为: Act
Android Studio 3.0 下使用Intent传递数据和数据回传的示例。实现了一个简单的登录界面,用户输入用户名和密码后,点击登录把用户名和密码传递到主界面,主界面显示用户名和密码,然后在主界面中购买一个物品,打开...
主要介绍了Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信,需要的朋友可以参考下
1、Intent的Component属性的作用是什么,如何定义此属性? component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终...
Android 隐式Intent的实例详解 前言: 顾名思义,隐式意图就是在不明确设置激活对象的前提下寻找最匹配的组件,举个例子,比如有5个人: (1)A:170cm (2)B:160cm (3)C:180cm (4)D:190cm (5)E:200cm 如果是...
//设置intent的Action属性 intent.setAction(Intent.ACTION_VIEW); //获取文件file的MIME类型 String type = getMIMEType(file); //设置intent的data和Type属性。 intent.setDataAndType(/*uri*/Uri.fromFile&...
(在manifest里面修改launchMode属性)有一个缺陷是:如果 该活动不在栈顶的话依然会启动。 3、singleTask模式,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已存在则直接使用,并把在...
Android 程序技术 本节课程内容:Activity启动模式与跳转 ...隐式意图则是通过指定action和category等属性,由系统根据这些信息进行分析后寻找目标Activity . 跳转实例 Jump instance THANK YOU 谢谢观看
在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden 例如: android:label="@string/app_name" android:windowSoftInputMode="adjustUnspecified|...