【原创】Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法
/********************************************************************************************
* author:[email protected]大钟
* E-mail:[email protected]
*http://blog.****.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、两种实现activity跳转的方法
实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();
例如activity A跳转到activity B
对于,第一种,是把activity A的数据,通过intent传送到activity B,但是不能返回数据。
关于第一种,可以参考我之前的这篇博文
http://blog.****.net/conowen/article/details/7270393
2、第二种方法startActivityForResult()的详细用法
今晚谈的是第二种方法startActivityForResult();可以实现把activity A数据传送给activity B,也可以把activity B的数据返回来给activity A处理。
- publicvoidstartActivityForResult(Intentintent,intrequestCode)
首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释
- requestCode:If>=0,thiscodewillbereturnedinonActivityResult()whentheactivityexits.
一般都是设置大于或者等于0,因为activity A可能不单单要跳转到activity B,也可能跳转到activity C,D,E……,这些activity返回来的数据都交由activity处理,那activity又通过什么来分辨返回来的数据到底是哪个activity回来的呢。
所以在activity A跳转到某一个activity时,要设定目标activity的requestCode,这个requestCode就唯一地标识了相对应的activity。
如下所示,当要跳转到activity B时,15表示是activity B的标识,
- IntentActivity.this.startActivityForResult(intent,15);
- IntentActivity.this.startActivityForResult(intent,25);
(通过onActivityResult方法可处理代表不同activity的requestCode数值,详细用法在第3点。)
3、数据处理方法onActivityResult()详解
然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)
3.1、数据处理方法onActivityResult()有三个参数,第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。
基本框架代码如下:
- switch(requestCode){
- case15:
- switch(resultCode){
- case0:
- //dosomething
- break;
- case1:
- //dosomething
- break;
- default:
- break;
- }
- break;
- case25:
- switch(resultCode){
- case0:
- //dosomething
- break;
- default:
- break;
- }
- default:
- break;
- }
3.2、第二个参数为resultCode,也是一个int类型,如果activity B有几种不同返回的结果,同样地可以通过resultCode来筛选。
当跳转到其他activity时,如activity B。需要知道的是,把activity B的数据返回去给activity A的处理方法是setResult (int resultCode, Intent data) ,可以看到它的第一个参数是resultCode,也就是对应着相应的处理方式,官方的推荐取值如下,这些是宏变量,实质是int。当然也可以自定义为数值,自己习惯就行了。
- RESULT_CANCELED
- RESULT_OK
- RESULT_FIRST_USER
具体做法如下:如你可以在activity B做如下设置,两个button的监听器对应着两个resultCode,也就对应了两种处理方式,至于你要做什么事,在监听器定义即可。
- button1.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //dosomething
- secondactivity.this.setResult(0,intent);
- secondactivity.this.finish();
- }
- });
- button2.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //dosomething
- secondactivity.this.setResult(1,intent);
- secondactivity.this.finish();
- }
- });
3.3、第三个参数为Intent data,为activity返回来的数值,如通过data.getStringExtra("key");就可以取出来。
注意:调用setResult()方法跳回原来的activity时,一定要调用finish方法结束当前的activity
另外,如果activity A只需要跳转到activity B而已,那跳转时,request code只要大于或者等于0就行,而数据处理的方法onActivityResult()如下结构就行了,不用筛选request code。
- switch(resultCode){
- case0:
- //dosomething
- break;
- case1:
- //dosomething
- break;
- default:
- break;
- }
===============================================================================================
附上详细代码
从第一个activity跳到第二个,主要是验证 resultCode,
从第一个activity跳到第三个activity 和跳到第二个activity,主要是验证requestCode
效果图:
- //IntentActivity为第一个activity
- packageconowen.Activity.intent;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassIntentActivityextendsActivity{
- /**CalledwhentheActivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Buttonbt=(Button)findViewById(R.id.bt);
- Buttonbt2=(Button)findViewById(R.id.bt13);
- bt.setOnClickListener(newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent(IntentActivity.this,
- secondactivity.class);
- //将intent绑定到第二个activity,然后开始跳转到第二个Activity
- IntentActivity.this.startActivityForResult(intent,15);
- //第二个参数为requestCode,大于或等于0,
- }
- });
- bt2.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent(IntentActivity.this,
- requestCodetest.class);//将intent绑定在第三个activity
- IntentActivity.this.startActivityForResult(intent,25);
- }
- });
- }
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- //TODOAuto-generatedmethodstub
- super.onActivityResult(requestCode,resultCode,data);
- switch(requestCode){//通过requestCode来辨别数据来自哪个activity
- case15://取得来自Activity2的数据,并显示于画面上
- switch(resultCode){//通过resultCode来辨别activity的相应处理方法
- case0:
- Stringresultstr1=data.getStringExtra("result");//取出传回来的数据
- TextViewtv=(TextView)findViewById(R.id.tv);
- tv.setText(resultstr1);//显示出来
- break;
- case1:
- Stringresultstr2=data.getStringExtra("result");
- TextViewtv1=(TextView)findViewById(R.id.tv);
- tv1.setText(resultstr2);
- Toast.makeText(this,
- "第2个activity的requestCode的值为"+requestCode,
- Toast.LENGTH_LONG).show();
- break;
- default:
- break;
- }
- break;
- case25:
- switch(resultCode){
- caseRESULT_OK:
- Stringresultstr3=data.getStringExtra("result3");
- Toast.makeText(this,
- "第3个activity的requestCode的值为"+requestCode,
- Toast.LENGTH_LONG).show();
- TextViewtv=(TextView)findViewById(R.id.tv);
- tv.setText(resultstr3);
- break;
- default:
- break;
- }
- default:
- break;
- }
- }
- }
- //secondactivity为第二个activity
- packageconowen.Activity.intent;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- publicclasssecondactivityextendsActivity{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.secondactivity);
- //获取启动这个activity的intent
- Buttonreturnbt1=(Button)findViewById(R.id.returnbt1);
- finalIntentintent=getIntent();
- returnbt1.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- EditTextet=(EditText)findViewById(R.id.et);
- Stringres=et.getText().toString();
- intent.putExtra("result",res);//把数据塞入intent里面
- secondactivity.this.setResult(0,intent);//跳转回原来的activity
- secondactivity.this.finish();//一定要结束当前activity
- }
- });
- Buttonreturnbt2=(Button)findViewById(R.id.returnbt2);
- returnbt2.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- intent.putExtra("result","验证resultcode");
- secondactivity.this.setResult(1,intent);
- secondactivity.this.finish();
- }
- });
- }
- }
- //requestCodetest是第三个activity
- packageconowen.Activity.intent;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- publicclassrequestCodetestextendsActivity{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.requestcode);//layout的xml文件名不能为大写字母
- Buttonbt3=(Button)findViewById(R.id.returnbt3);
- bt3.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //这个activity主要是为了验证requestCode
- EditTextet3=(EditText)findViewById(R.id.et3);
- Intentintent=getIntent();//获取启动这个activity的intent
- Stringres=et3.getText().toString();
- intent.putExtra("result3",res);
- requestCodetest.this.setResult(RESULT_OK,intent);
- requestCodetest.this.finish();
- }
- });
- }
- }