赞
踩
1、 什么是Intent?它是干什么用的?
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
· 通过startActivity() orstartActivityForResult()启动一个Activity;
· 通过 startService() 启动一个服务,或者通过bindService() 和后台服务交互;
· 通过广播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())发给broadcast receivers
2、 Intent语法结构
语法结构:
Intent intent = new Intent() ; Intent intent = new Intent(Intent) ; Intent intent = new Intent(action) ; Intent intent = new Intent(action ,Uri) ; Intent intent = new Intent(Context.this,Activity.class) ; Intent intent = new Intent(action,Uri,this,Activity.class) ; |
3、 Intent特点
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。那么Android是怎样寻找到这个最合适的组件呢?
指定了一个intent-filter,Intent Filter(过滤器)其实就是用来匹配隐式Intent的,如果Intent Filter定义的动作、类别、数据(URI和数据类型)与Intent匹配,就会使用Intent Filter所在的组件来处理该Intent。想要接收使用startActivity()方法传递的隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"
例如:
声明意图:
<intent-filter> <action android:name="cn.itcast.lao.li" /> <action android:name="cn.itcast.lao.zhang" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="cn.itcast.category.li" /> <data android:scheme="itcast" android:host="www.itcast.cn" android:path="/person"/> <data android:mimeType="image/gif"/> </intent-filter> |
调用:
Intent intent = new Intent(); intent.setAction("cn.itcast.lao.li"); intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif"); startActivity(intent); |
注意:
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent, 最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的, 判断方法如下:
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。
4、 Intent主要属性
1)Action,也就是要执行的动作
SDk中定义了一些标准的动作。当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们的自定义动作。
2)Data,也就是执行动作要操作的数据
Android 中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其 URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由contentprovider提供的数据则为content: URIs。
3)Type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
4)Category(类 别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。
5)Component(组 件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
6)Extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
5、关于Intent常用代码:
1).无参数Activity跳转
Intent intent = new Intent(Activity.Main.this, Activity2.class); startActivity(intent); |
2)向下一个Activity传递数据(使用Bundle和Intent.putExtras)
Intent intent = new Intent(Activity.Main.this, Activity2.class); Bundle bundle=new Bundle(); bundle.putString("name", "This is from MainActivity!"); intent.putExtras(bundle); // it.putExtra(“test”, "shuju”); startActivity(intent); // startActivityForResult(it,REQUEST_CODE);
数据的获取可以采用: Bundle bundle=getIntent().getExtras(); String name=bundle.getString("name"); |
3)向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)
Intent intent=getIntent(); Bundle bundle2=new Bundle(); bundle2.putString("name", "This is from ShowMsg!"); intent.putExtras(bundle2); setResult(RESULT_OK, intent); |
4)回调上一个Activity的结果处理函数(onActivityResult)
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (requestCode==REQUEST_CODE){ if(resultCode==RESULT_CANCELED) setTitle("cancle"); else if (resultCode==RESULT_OK) { String temp=null; Bundle bundle=data.getExtras(); if(bundle!=null) temp=bundle.getString("name"); setTitle(temp); } } } |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。