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

【原创】Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法

 
阅读更多


/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
*http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/

1、两种实现activity跳转的方法

实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();

例如activity A跳转到activity B



对于,第一种,是把activity A的数据,通过intent传送到activity B,但是不能返回数据。

关于第一种,可以参考我之前的这篇博文

http://blog.csdn.net/conowen/article/details/7270393

2、第二种方法startActivityForResult()的详细用法

今晚谈的是第二种方法startActivityForResult();可以实现把activity A数据传送给activity B,也可以把activity B的数据返回来给activity A处理。

  1. publicvoidstartActivityForResult(Intentintent,intrequestCode)

首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释

  1. 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的标识,

  1. IntentActivity.this.startActivityForResult(intent,15);
同理,当在activity A的另外一个监听器要跳转到activity C时,设定activity C的标识为25。(大于或者等于0就行了)
  1. IntentActivity.this.startActivityForResult(intent,25);

(通过onActivityResult方法可处理代表不同activity的requestCode数值,详细用法在第3点。)


3、数据处理方法onActivityResult()详解


然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:

  1. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)


3.1、数据处理方法onActivityResult()有三个参数,第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。


基本框架代码如下:

  1. switch(requestCode){
  2. case15:
  3. switch(resultCode){
  4. case0:
  5. //dosomething
  6. break;
  7. case1:
  8. //dosomething
  9. break;
  10. default:
  11. break;
  12. }
  13. break;
  14. case25:
  15. switch(resultCode){
  16. case0:
  17. //dosomething
  18. break;
  19. default:
  20. break;
  21. }
  22. default:
  23. break;
  24. }

3.2、第二个参数为resultCode,也是一个int类型,如果activity B有几种不同返回的结果,同样地可以通过resultCode来筛选。

当跳转到其他activity时,如activity B。需要知道的是,把activity B的数据返回去给activity A的处理方法是setResult (int resultCode, Intent data) ,可以看到它的第一个参数是resultCode,也就是对应着相应的处理方式,官方的推荐取值如下,这些是宏变量,实质是int。当然也可以自定义为数值,自己习惯就行了。

  1. RESULT_CANCELED
  2. RESULT_OK
  3. RESULT_FIRST_USER

具体做法如下:如你可以在activity B做如下设置,两个button的监听器对应着两个resultCode,也就对应了两种处理方式,至于你要做什么事,在监听器定义即可。


  1. button1.setOnClickListener(newOnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. //TODOAuto-generatedmethodstub
  5. //dosomething
  6. secondactivity.this.setResult(0,intent);
  7. secondactivity.this.finish();
  8. }
  9. });
  10. button2.setOnClickListener(newOnClickListener(){
  11. @Override
  12. publicvoidonClick(Viewv){
  13. //TODOAuto-generatedmethodstub
  14. //dosomething
  15. secondactivity.this.setResult(1,intent);
  16. secondactivity.this.finish();
  17. }
  18. });

3.3、第三个参数为Intent data,为activity返回来的数值,如通过data.getStringExtra("key");就可以取出来。


注意:调用setResult()方法跳回原来的activity时,一定要调用finish方法结束当前的activity

另外,如果activity A只需要跳转到activity B而已,那跳转时,request code只要大于或者等于0就行,而数据处理的方法onActivityResult()如下结构就行了,不用筛选request code。

  1. switch(resultCode){
  2. case0:
  3. //dosomething
  4. break;
  5. case1:
  6. //dosomething
  7. break;
  8. default:
  9. break;
  10. }

===============================================================================================

附上详细代码

从第一个activity跳到第二个,主要是验证 resultCode,

从第一个activity跳到第三个activity 和跳到第二个activity,主要是验证requestCode

效果图:


  1. //IntentActivity为第一个activity
  2. packageconowen.Activity.intent;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.TextView;
  10. importandroid.widget.Toast;
  11. publicclassIntentActivityextendsActivity{
  12. /**CalledwhentheActivityisfirstcreated.*/
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. Buttonbt=(Button)findViewById(R.id.bt);
  18. Buttonbt2=(Button)findViewById(R.id.bt13);
  19. bt.setOnClickListener(newView.OnClickListener(){
  20. @Override
  21. publicvoidonClick(Viewv){
  22. //TODOAuto-generatedmethodstub
  23. Intentintent=newIntent(IntentActivity.this,
  24. secondactivity.class);
  25. //将intent绑定到第二个activity,然后开始跳转到第二个Activity
  26. IntentActivity.this.startActivityForResult(intent,15);
  27. //第二个参数为requestCode,大于或等于0,
  28. }
  29. });
  30. bt2.setOnClickListener(newOnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewv){
  33. //TODOAuto-generatedmethodstub
  34. Intentintent=newIntent(IntentActivity.this,
  35. requestCodetest.class);//将intent绑定在第三个activity
  36. IntentActivity.this.startActivityForResult(intent,25);
  37. }
  38. });
  39. }
  40. @Override
  41. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  42. //TODOAuto-generatedmethodstub
  43. super.onActivityResult(requestCode,resultCode,data);
  44. switch(requestCode){//通过requestCode来辨别数据来自哪个activity
  45. case15://取得来自Activity2的数据,并显示于画面上
  46. switch(resultCode){//通过resultCode来辨别activity的相应处理方法
  47. case0:
  48. Stringresultstr1=data.getStringExtra("result");//取出传回来的数据
  49. TextViewtv=(TextView)findViewById(R.id.tv);
  50. tv.setText(resultstr1);//显示出来
  51. break;
  52. case1:
  53. Stringresultstr2=data.getStringExtra("result");
  54. TextViewtv1=(TextView)findViewById(R.id.tv);
  55. tv1.setText(resultstr2);
  56. Toast.makeText(this,
  57. "第2个activity的requestCode的值为"+requestCode,
  58. Toast.LENGTH_LONG).show();
  59. break;
  60. default:
  61. break;
  62. }
  63. break;
  64. case25:
  65. switch(resultCode){
  66. caseRESULT_OK:
  67. Stringresultstr3=data.getStringExtra("result3");
  68. Toast.makeText(this,
  69. "第3个activity的requestCode的值为"+requestCode,
  70. Toast.LENGTH_LONG).show();
  71. TextViewtv=(TextView)findViewById(R.id.tv);
  72. tv.setText(resultstr3);
  73. break;
  74. default:
  75. break;
  76. }
  77. default:
  78. break;
  79. }
  80. }
  81. }


  1. //secondactivity为第二个activity
  2. packageconowen.Activity.intent;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.EditText;
  10. publicclasssecondactivityextendsActivity{
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. //TODOAuto-generatedmethodstub
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.secondactivity);
  16. //获取启动这个activity的intent
  17. Buttonreturnbt1=(Button)findViewById(R.id.returnbt1);
  18. finalIntentintent=getIntent();
  19. returnbt1.setOnClickListener(newOnClickListener(){
  20. @Override
  21. publicvoidonClick(Viewv){
  22. //TODOAuto-generatedmethodstub
  23. EditTextet=(EditText)findViewById(R.id.et);
  24. Stringres=et.getText().toString();
  25. intent.putExtra("result",res);//把数据塞入intent里面
  26. secondactivity.this.setResult(0,intent);//跳转回原来的activity
  27. secondactivity.this.finish();//一定要结束当前activity
  28. }
  29. });
  30. Buttonreturnbt2=(Button)findViewById(R.id.returnbt2);
  31. returnbt2.setOnClickListener(newOnClickListener(){
  32. @Override
  33. publicvoidonClick(Viewv){
  34. //TODOAuto-generatedmethodstub
  35. intent.putExtra("result","验证resultcode");
  36. secondactivity.this.setResult(1,intent);
  37. secondactivity.this.finish();
  38. }
  39. });
  40. }
  41. }

  1. //requestCodetest是第三个activity
  2. packageconowen.Activity.intent;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.EditText;
  10. publicclassrequestCodetestextendsActivity{
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. //TODOAuto-generatedmethodstub
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.requestcode);//layout的xml文件名不能为大写字母
  16. Buttonbt3=(Button)findViewById(R.id.returnbt3);
  17. bt3.setOnClickListener(newOnClickListener(){
  18. @Override
  19. publicvoidonClick(Viewv){
  20. //TODOAuto-generatedmethodstub
  21. //这个activity主要是为了验证requestCode
  22. EditTextet3=(EditText)findViewById(R.id.et3);
  23. Intentintent=getIntent();//获取启动这个activity的intent
  24. Stringres=et3.getText().toString();
  25. intent.putExtra("result3",res);
  26. requestCodetest.this.setResult(RESULT_OK,intent);
  27. requestCodetest.this.finish();
  28. }
  29. });
  30. }
  31. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics