/********************************************************************************************
 * 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. public void startActivityForResult (Intent intent, int requestCode)

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

  1. requestCode  :   If >= 0, this code will be returned in onActivityResult() when the activity exits.

一般都是设置大于或者等于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. protected void onActivityResult (int requestCode, int resultCode, Intent data)

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

基本框架代码如下:

  1. switch (requestCode) {
  2. case 15:
  3. switch (resultCode) {
  4. case 0:
  5. //do something
  6. break;
  7. case 1:
  8. //do something
  9. break;
  10. default:
  11. break;
  12. }
  13. break;
  14. case 25:
  15. switch (resultCode) {
  16. case 0:
  17. //do something
  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(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. //do something
  6. secondactivity.this.setResult(0, intent);
  7. secondactivity.this.finish();
  8. }
  9. });
  10. button2.setOnClickListener(new OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. // TODO Auto-generated method stub
  14. //do something
  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. case 0:
  3. //do something
  4. break;
  5. case 1:
  6. //do something
  7. break;
  8. default:
  9. break;
  10. }

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

附上详细代码

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

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

效果图:

  1. //IntentActivity为第一个activity
  2. package conowen.Activity.intent;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10. import android.widget.Toast;
  11. public class IntentActivity extends Activity {
  12. /** Called when the Activity is first created. */
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. Button bt = (Button) findViewById(R.id.bt);
  18. Button bt2 = (Button) findViewById(R.id.bt13);
  19. bt.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. // TODO Auto-generated method stub
  23. Intent intent = new Intent(IntentActivity.this,
  24. secondactivity.class);
  25. // 将intent绑定到第二个activity,然后开始跳转到第二个Activity
  26. IntentActivity.this.startActivityForResult(intent, 15);
  27. // 第二个参数为requestCode,大于或等于0,
  28. }
  29. });
  30. bt2.setOnClickListener(new OnClickListener() {
  31. @Override
  32. public void onClick(View v) {
  33. // TODO Auto-generated method stub
  34. Intent intent = new Intent(IntentActivity.this,
  35. requestCodetest.class);//将intent绑定在第三个activity
  36. IntentActivity.this.startActivityForResult(intent, 25);
  37. }
  38. });
  39. }
  40. @Override
  41. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  42. // TODO Auto-generated method stub
  43. super.onActivityResult(requestCode, resultCode, data);
  44. switch (requestCode) {// 通过requestCode来辨别数据来自哪个activity
  45. case 15:// 取得来自Activity2的数据,并显示于画面上
  46. switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法
  47. case 0:
  48. String resultstr1 = data.getStringExtra("result");// 取出传回来的数据
  49. TextView tv = (TextView) findViewById(R.id.tv);
  50. tv.setText(resultstr1);// 显示出来
  51. break;
  52. case 1:
  53. String resultstr2 = data.getStringExtra("result");
  54. TextView tv1 = (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. case 25:
  65. switch (resultCode) {
  66. case RESULT_OK:
  67. String resultstr3 = data.getStringExtra("result3");
  68. Toast.makeText(this,
  69. "第3个activity的requestCode的值为" + requestCode,
  70. Toast.LENGTH_LONG).show();
  71. TextView tv = (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. package conowen.Activity.intent;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. public class secondactivity extends Activity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. // TODO Auto-generated method stub
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.secondactivity);
  16. // 获取启动这个activity的intent
  17. Button returnbt1 = (Button) findViewById(R.id.returnbt1);
  18. final Intent intent = getIntent();
  19. returnbt1.setOnClickListener(new OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. // TODO Auto-generated method stub
  23. EditText et = (EditText) findViewById(R.id.et);
  24. String res = et.getText().toString();
  25. intent.putExtra("result", res);// 把数据塞入intent里面
  26. secondactivity.this.setResult(0, intent);// 跳转回原来的activity
  27. secondactivity.this.finish();// 一定要结束当前activity
  28. }
  29. });
  30. Button returnbt2 = (Button) findViewById(R.id.returnbt2);
  31. returnbt2.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. // TODO Auto-generated method stub
  35. intent.putExtra("result", "验证result code");
  36. secondactivity.this.setResult(1, intent);
  37. secondactivity.this.finish();
  38. }
  39. });
  40. }
  41. }
  1. //requestCodetest是第三个activity
  2. package conowen.Activity.intent;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. public class requestCodetest extends Activity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. // TODO Auto-generated method stub
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.requestcode);// layout的xml文件名不能为大写字母
  16. Button bt3 = (Button) findViewById(R.id.returnbt3);
  17. bt3.setOnClickListener(new OnClickListener() {
  18. @Override
  19. public void onClick(View v) {
  20. // TODO Auto-generated method stub
  21. // 这个activity主要是为了验证requestCode
  22. EditText et3 = (EditText) findViewById(R.id.et3);
  23. Intent intent = getIntent();// 获取启动这个activity的intent
  24. String res = et3.getText().toString();
  25. intent.putExtra("result3", res);
  26. requestCodetest.this.setResult(RESULT_OK, intent);
  27. requestCodetest.this.finish();
  28. }
  29. });
  30. }
  31. }

intent的startActivityForResult()方法的更多相关文章

  1. android Intent的startActivityForResult()方法

    startActivityForResult() 之前学习了利用Intent跳转页面的同时传值,但有的时候需要从跳转到的页面返回所需要的值(如修改了用户信息,需要返回修改的信息),通俗的意思就是A.A ...

  2. 从零开始学android开发-详细谈谈intent的startActivityForResult()方法

    1.两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到act ...

  3. Sqlite操作的一些关键类的官方说明与Intent的startactivityforresult方法

    Intent: 该功能可以用于通过intent来跳转界面时候传递信号给原理的页面,以便做出一些处理: sqlite的使用: 该方法得到的sqlitedatabase可读可写,而getreadabled ...

  4. 使用startActivityForResult方法(转)

    功能:  A.java 是主界面,B.java 是子功能模块,要从A启动B,B干完活之后把结果汇报给A 注意: 使用startActivityForResult方法 在配置文件就是不能指定Activi ...

  5. Android:通过startActivityForResult方法来得到Activity的回传值

    在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方 ...

  6. startActivityForResult()方法具体解释

    我们都知道.要开启一个Activity能够在上下文环境中调用startActivity()方法. 可是假设想从开启的Activity中获取某些数据,就能够使用startActivityForResul ...

  7. 两个activity之间传递数据用startActivityForResult方法。

    package com.example.testactivityresquest; import android.app.Activity; import android.content.Intent ...

  8. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  9. 【Android】Intent的使用-返回数据给上一个活动

    第一个Activity  A启动另外一个Activity B,B返回数据给A ============================================================= ...

随机推荐

  1. Ext4 简单的treepanel

    转载:http://blog.csdn.net/zyujie/article/details/8208499 最近在学习Ext4,记录一些有关Ext4实现控件的方法: Ext4的treePanel和之 ...

  2. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途

    init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewContro ...

  3. KNN(k-nearest-neighbor)算法

    一.算法概述 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.KNN算法中, 所选择的邻居都是已经正确分类的对象(训练 ...

  4. 基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3966794.html. 上章节讲解了讲解一个用eXosip2库实现 ...

  5. 疯狂学习java web3(javaScript)

    js之前有看过,只不过是在C++代码中通过UI引擎调用js进行画图,当时就为语法问题痛苦了半天,结果现在java web了,更是处处是js,再次陷入痛苦中. js实际例子: <!DOCTYPE ...

  6. 基于daridus认证的openvpn部署

    基于daridus认证的openvpn部署 安装openvpn 1.安装openvpn依赖包 #yum -y install gcc gcc-c++ #yum -y install openssl o ...

  7. Java学习----对象的构造

    public class Teacher { private String teacherName; private String gendar; // 构造方法:初始化属性值,没有返回类型 publ ...

  8. [HttpClient]HttpClient简介

    1. 前言 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java应用程序需要直接通过 HTTP 协议来访问网路资源.虽然在 JDK 的 java net包中已 ...

  9. Git 远程仓库的管理和使用

    要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写.同他人协作开发某 个项目时,需要管理这些远程仓库 ...

  10. jquery ajax(5)form表单序列化

    form表单序列化<script type="text/javascript"> $(function(){ $("#send").click(fu ...