过程说明:在一个主界面(主Activity)上能连接许多不同功能模块,当子模块的事情做完了之后就要回到主界面去,有时候还会带上一些子模块完成的数据交给主Activity去处理
//启动B
Intent bintent = new Intent(A.this,B.class); //创建启动B的意图
//设置bintent的Bundle的一个值
String bsay = "Hello,this is B speaking";
bintent.putExtra("listenB",bsay);
startActivityForResult(bintent,0);//参数(Intent intent,Int requestCode)的requestCode对应回收Boudle时使用
//重写onActivityResult()来处理返回的数据(回调)
//这里有三个参数requestCode,resultCode,data
protected void onActivityResult(int requestCode,int resultCode,intent data)
{
switch(resultCode)
{
case: RESULT_OK;
Boudle b = data.getExtras();//data为B中穿过来的intent
String str=b.getString("listenB");//str即为回传的值“Hello,this。。。”
break;
default:
break;
}
}
-----------------------------------------------------------------------
//----B.java--//
//用setRest()准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发回会给A,
//并且运行onActivityRestult()部分的代码
Intent aintent = new Intent(B.this,A.class);
.....将数据打包到aintent Bundle的过程'
setResult(RESULT_OK,aintent); //这里有2个参数(int resultCode,Intent intent)
......
finish();
----------------------------------------------------------------
startActivityForResult(Intent intent,Int requestCode)
intent 传给B的意图
requestCode >0即可,用于在onActivityRest()区别哪个子模块回传的数据,如果还有C.java,D.java...区分不同
//的requestCode
setRestult(int resultCode,Intent intent)
resultCode如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。一般都用RESULT_OK
intent 回传给A的onActivityResult()
onActivityResult(int requestCode,int resultCode,Intent intent)
回调函数,如果不对int requestCode,int resultCode区别,那么回到A的onActivityResult()会无差别处理
Intent对象描述
Intent负责对应用中一次操作的动作、动作涉及的数据、附加数据进行封装,Android操作系统根据这个Intent的内容
再去找到对应的组件,把这个Intent对象传递给对方,(android操作系统此时充当快递员的角色)。
Intent不仅仅可以实现应用app之间的通信,还可以实现在应用app内部不同的activity之间的通信。
Intent专门提供组件之间互相调用的相关信息。
通过Context.startActivity() or Activity.startActivityForResult() 启动一个Activity;
通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;
通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()) 发给broadcast receivers。
Intent的属性
1) action--要执行的动作
sdk中已经定义的常量
也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR
”),并可定义相应的Activity来处理我们的自定义动作。
2)Data,也就是执行动作要操作的数据
Android中action要操作的数据,用URI(uniform resource Identifier)来标志要操作的数据。不同action的data类型是不同的,如如在联系人应用中,一个指向某联系人的URI可能content(目录)为:content://contacts/1;如ACTION_EDIT(显示数据,让用户来编辑)指定Data为 文件URI,打电话为tel:URI
3)type,用于显式的表示data的类型,虽然android系统可以通过解析data而知道它的类型,但是根据这个type属性的设置可以不用解析,直接知道类型
4)category(类别)
5)component(组件)如果使用这个属性的话,那么可以直接转掉到这个属性所指的组件。
6)extras(额外信息)这个属性用来为新启动的activity提供 一些信息,如:当登录界面转跳到功能界面的时候,可以为功能界面提供 登录者的信息。
如:当要发送电子邮件的时候,可以把要发送的 联系人信息和要发送的内容,放进extras内,然后把带有这个extras的Intent通过操作系统递给 邮件发送组件。
注意: Intent 来启动另一个组件 分为 1.显示启动 2.隐式启动 1.显示启动 可以在代码中指定要启动的确定组件。 2.隐式启动 只在代码中提出了对方的
的条件,由操作系统根据条件来刷选出 符合条件的组件。
Android系统的刷选机制:
android通过查找AndroidManifest.xml文件中注册的activity的intent--filter来确定目标组件。主要是action,category,type来确定。
- 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
- 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
- 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
- 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别(需要什么,供货商必须并且至少满足需求)。
intent用法例子:
1.无参数Activity跳转
Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)
Intent it = new Intent(Activity.Main.this, Activity2.class); Bundle bundle=new Bundle(); bundle.putString("name", "This is from MainActivity!"); it.putExtras(bundle); // it.putExtra(“test”, "shuju”); startActivity(it); // 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)
@Override 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); } } }
传送SMS/MMS
1. //调用短信程序
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. it.putExtra("sms_body", "The SMS text");
4. it.setType("vnd.android-dir/mms-sms");
5. startActivity(it);
1. //传送消息
2. Uri uri = Uri.parse("smsto://0800000123");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. it.putExtra("sms_body", "The SMS text");
5. startActivity(it);
1. //传送 MMS
2. Uri uri = Uri.parse("content://media/external/images/media/23");
3. Intent it = new Intent(Intent.ACTION_SEND);
4. it.putExtra("sms_body", "some text");
5. it.putExtra(Intent.EXTRA_STREAM, uri);
6. it.setType("image/png");
7. startActivity(it);