在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,还同时返回一些子模块完成的数据交给主Activity处理。

用startActivity启动主界面是一个新的Intent实例,而访问的主界面还在activity栈的下面没有调出来,这样做的一个最大的问题是,回不到原界面就不能多个子功能模块共同来给主界面提供数据或服务了。
目的: A.java 是主界面,B.java 是子功能模块,要从A启动B,B干完活之后把结果汇报给A
先看 A.java 的相关代码
//-- A.java --//
//启动B
Intent bintent = new Intent(A.this, B.class);
//设置 bintent的Bundle的一个值
String bsay = "Hello, this is B speaking"; 
bintent.putExtra("listenB", bsay)
startActivityForResult(bintent,0); // 参数(Intent intent, Int requestCode) 的 requestCode 对应下面回收Bundle时识别用的
//重写onActivityResult()来处理返回的数据,建议先看B.java 的代码再回来看这里比较好理解
//这理有三个参数 requestCode, resultCode, data
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
case RESULT_OK:
Bundle b=data.getExtras();  //data为B中回传的Intent
String str=b.getString("ListenB");//str即为回传的值"Hello, this is B speaking"
break;
default:
break;
}
}
-------------------------------------------------------------------------------------
//-- B.java --//
// 用 setResut() 准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发给A且运行onActivityResult()部分的代码
Intent aintent = new Intent(B.this, A.class);
setResut(RESULT_OK,aintent); //这理有2个参数(int resultCode, Intent intent)
... ...
finish();
startActivityForResult(Intent intent, Int requestCode)
intent 传给B,requestCode >=0,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。
setResut(int resultCode, Intent intent)
resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好。
onActivityResult(int requestCode, int resultCode, Intent intent)
这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理。
//
************************************************************************************************************
/

首先看结构 这个结构由三部分组成:

startActivityForResult

onActivityResult()

setResult()

这个三个函数构成

具体的参数就不写了 应该能知道。

注意的是调用setResult之后必须调用finish()不然的话 是不会跳转的

调用setResult的时候直接调用即将回跳的函数的

onActivityResult() 然后在调用该函数的onrestart onstart onresume  如果你在每个setResult后下finish方法 那么该activity直接调用destory方法。

第一个activity

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.v("startforrequest", "onCreate:"+this.getLocalClassName());
        Button bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(new OnClickListener(){

@Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent=new Intent(StartForResultTest.this,StartForResultTest1.class);
    startActivityForResult(intent, 0);
   }});
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     // TODO Auto-generated method stub
     super.onActivityResult(requestCode, resultCode, data);
     Log.v("startforrequest", "onActivityResult: "+requestCode+" : "+resultCode);
    }

第二个activity

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        Log.v("startforrequest", "onCreate:"+this.getLocalClassName());
        Button bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(new OnClickListener(){

@Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent=new Intent(StartForResultTest1.this,StartForResultTest2.class);
    startActivityForResult(intent, 1);
   }});
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     // TODO Auto-generated method stub
     super.onActivityResult(requestCode, resultCode, data);
     Intent intent=new Intent(this,StartForResultTest.class);
     setResult(1, intent);
     finish();
     Log.v("startforrequest", "onActivityResult: "+requestCode+" : "+resultCode);
    }

第三个也就是最后一个activity

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        Log.v("startforrequest", "onCreate:"+this.getLocalClassName());
        Button bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(new OnClickListener(){

@Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent=new Intent(StartForResultTest2.this,StartForResultTest1.class);
       setResult(2, intent);
       finish();
   }});
    }

那么当跳转到最后一个的时候 回直接调回第一个activity 调用restart start resume方法之后

再destory 最后一个 倒数第二个..

/

startActivityForResult Demo

startActivityForResult(Itent intent, int requestCode)用来唤起一个Activity。利用这个方法,前一个Activity1便会有一个等待次Activity2的返回,返回时响应onActivityResult(int requestCode, int resultCode, Intent data)方法。
  Demo如下:
  第一个activity

Java代码  
  1. package com.kevin.intent;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. public class Main extends Activity implements OnClickListener{
  10. private Button btn_transfer;
  11. private EditText et_name;
  12. private int requestCode = 1;
  13. /** Called when the activity is first created. */
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. btn_transfer = (Button) findViewById(R.id.button1);
  19. et_name = (EditText) findViewById(R.id.editText1);
  20. btn_transfer.setOnClickListener(this);
  21. }
  22. @Override
  23. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  24. System.out.println("requestCode--->" + requestCode);
  25. // resultCode是第二个Activity返回过来的值
  26. switch (resultCode) {
  27. case RESULT_OK:
  28. // 获取Bundle对象
  29. Bundle returnedBundle = data.getExtras();
  30. String returnedName = returnedBundle.getString("name");
  31. et_name.setText(returnedName);
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. @Override
  38. public void onClick(View v) {
  39. // 取得et_name的值
  40. String name = et_name.getText().toString();
  41. Bundle bundle = new Bundle();
  42. bundle.putString("name", name);
  43. Intent intent = new Intent();
  44. intent.setClass(this, Activity_1.class);
  45. intent.putExtras(bundle);
  46. // 启动Activity_1
  47. startActivityForResult(intent, requestCode);
  48. }
  49. }
package com.kevin.intent;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;public class Main extends Activity implements OnClickListener{private Button btn_transfer;private EditText et_name;private int requestCode = 1;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btn_transfer = (Button) findViewById(R.id.button1);et_name = (EditText) findViewById(R.id.editText1);btn_transfer.setOnClickListener(this);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {System.out.println("requestCode--->" + requestCode);// resultCode是第二个Activity返回过来的值switch (resultCode) {case RESULT_OK:// 获取Bundle对象Bundle returnedBundle = data.getExtras();String returnedName = returnedBundle.getString("name");et_name.setText(returnedName);break;default:break;}}@Overridepublic void onClick(View v) {// 取得et_name的值String name = et_name.getText().toString();Bundle bundle = new Bundle();bundle.putString("name", name);Intent intent = new Intent();intent.setClass(this, Activity_1.class);intent.putExtras(bundle);        // 启动Activity_1startActivityForResult(intent, requestCode);}}

跳转后的activity

Java代码  
  1. package com.kevin.intent;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9. public class Activity_1 extends Activity implements OnClickListener{
  10. private Button btn_return;
  11. private TextView textView;
  12. private Intent intent;
  13. /** Called when the activity is first created. */
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity1);
  18. intent = this.getIntent();
  19. Bundle bundle = intent.getExtras();
  20. String name = bundle.getString("name");
  21. System.out.println("name --- >" + name);
  22. textView = (TextView) findViewById(R.id.tv_receivedname);
  23. textView.setText("传过来的name值为: " + name);
  24. btn_return = (Button) findViewById(R.id.btn_return);
  25. btn_return.setOnClickListener(this);
  26. }
  27. @Override
  28. public void onClick(View v) {
  29. // 点击返回按钮后,设置返回值
  30. setResult(RESULT_OK, intent);
  31. this.finish();
  32. }
  33. }
package com.kevin.intent;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class Activity_1 extends Activity implements OnClickListener{private Button btn_return;private TextView textView;private Intent intent;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);intent = this.getIntent();Bundle bundle = intent.getExtras();String name = bundle.getString("name");System.out.println("name --- >" + name);textView = (TextView) findViewById(R.id.tv_receivedname);textView.setText("传过来的name值为: " + name);btn_return = (Button) findViewById(R.id.btn_return);btn_return.setOnClickListener(this);}@Overridepublic void onClick(View v) {// 点击返回按钮后,设置返回值setResult(RESULT_OK, intent);this.finish();}
}
  • IntentDemo3.zip (45.2 KB)

startActivityForResult()相关推荐

  1. Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...

    最近一个 App 中用到了 startActivityForResult() 方法,使用的时候却出现了一些问题,比如我在 Activity A 中调用该方法向 Activity B 中跳转,如果 B  ...

  2. android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData()在应用程序之外公开

    本文翻译自:android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app thr ...

  3. python 替换字符串的方法replace()、正则re.sub()

    一.replace()函数 1用字符串本身的replace方法: a = 'hello word' b = a.replace('word','python') print b 1 2 3 二.re. ...

  4. Scrapy 学习笔记(-)

    Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所 ...

  5. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()

    1) ·············· 2)`````````v1.begin() 和v1.end()  是作为迭代器v1的 第一个位置  和 最后一个元素的下一个位置. `````````````v1. ...

  6. 转:【CSS/JS学习】如何实现单行/多行文本溢出的省略(...)--老司机绕过坑道的正确姿势...

    本文来源:http://www.cnblogs.com/penghuwan/p/6682303.html 引言: 写前端UI的朋友们也许都遇到过这样的问题:我们需要实现这样一个需求,在一个父级元素中隐 ...

  7. Python中的对象,类,super()函数

    对象:(1)外观的特征 (2)正在做的事情 比如:那个穿蓝色衣服的正在打球的帅哥  类:属性(静态的变量)+方法(函数)是对对象的近似 类名约定是以大写字母开始的 类的出现: 是为了使得对象可以进行大 ...

  8. Python中的super()函数

    多路继承的问题 描述: 解决这样的问题Python中可以使用super() super()函数有点: (1)在父类中可以直接的调用未绑定的方法 (2)在确保所有的父类的构造方法都使用了super()函 ...

  9. 函数assert()详解

    函数assert()详解: 断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式.预处理器产生测试该断言的代码,如果断言不为真, ...

最新文章

  1. 如何优雅地根治null值引起的Bug!
  2. 1.8 Java字节流和字符流的区别,如何区分输入流和输出流?
  3. 正则表达式与神经网络的深度融合
  4. 锦州财经学校计算机系,锦州一职高与财经学校哪个好
  5. Zookeeper基于Java 访问-节点权限设置
  6. java 字谜_计算字谜的出现次数
  7. linux制作成后台服务,把dotnetcore 控制台app设置成linux后台服务
  8. 基于金融知识图谱的会计欺诈风险识别方法
  9. 【Java】浅谈Java的I/O体系
  10. Tomcat下载及配置(IDEA)
  11. 铨顺宏RFID:应用超高频RFID技术智能档案管理系统
  12. java 面单模板_顺丰电子面单JSON请求格式
  13. c语言 qt 写小游戏,Qt实现Flappy Bird游戏
  14. Python爬虫进行web 数据可视化挖掘总结和分析
  15. win10c语言关机,win10如何设置定时关机?
  16. mysql数据库recover_xxx数据库恢复 mariadb数据库误删除恢复 mysql数据库被黑删库恢复
  17. MYSQL数据库----删除命令
  18. 云桌面计算机系统管理,教学虚拟云桌面管理系统解决方案
  19. 路由器重温——接口配置与管理1
  20. 矿泉水溴酸盐超标如何解决?除溴酸盐设备有哪些?

热门文章

  1. PHP爬取企业详情(百度信用)
  2. POJ1125 Floyd
  3. 【Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )
  4. 【数字信号处理】相关函数应用 ( 相关函数应用场景 | 噪声中检测信号原理 )
  5. 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )
  6. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  7. 【Flutter】Flutter 布局组件 ( 布局组件简介 | Row 组件 | Column 组件 | SizedBox 组件 | ClipOval 组件 )
  8. [Spring cloud 一步步实现广告系统] 14. 全量索引代码实现
  9. oracle操作字符串:拼接、替换、截取、查找
  10. jsonp解析 html