从零开始学android开发-详细谈谈intent的startActivityForResult()方法
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处理。
public void startActivityForResult (Intent intent, int requestCode)
首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释
requestCode : If >= , 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的标识,
IntentActivity.this.startActivityForResult(intent, );
同理,当在activity A的另外一个监听器要跳转到activity C时,设定activity C的标识为25。(大于或者等于0就行了)
IntentActivity.this.startActivityForResult(intent, );
(通过onActivityResult方法可处理代表不同activity的requestCode数值,详细用法在第3点。)
3、数据处理方法onActivityResult()详解
然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:
protected void onActivityResult (int requestCode, int resultCode, Intent data)
3.1、数据处理方法onActivityResult()有三个参数,第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。
基本框架代码如下:
switch (requestCode) {
case :
switch (resultCode) {
case :
//do something
break;
case :
//do something
break;
default:
break;
}
break;
case :
switch (resultCode) {
case :
//do something
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(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//do something
secondactivity.this.setResult(, intent);
secondactivity.this.finish();
}
});
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//do something
secondactivity.this.setResult(, 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) {
case :
//do something
break;
case :
//do something
break;
default:
break;
}
附上详细代码
从第一个activity跳到第二个,主要是验证 resultCode,
从第一个activity跳到第三个activity 和跳到第二个activity,主要是验证requestCode
效果图:

//IntentActivity为第一个activity package conowen.Activity.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;
import android.widget.Toast; public class IntentActivity extends Activity { /** Called when the Activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); Button bt = (Button) findViewById(R.id.bt);
Button bt2 = (Button) findViewById(R.id.bt13); bt.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(IntentActivity.this,
secondactivity.class);
// 将intent绑定到第二个activity,然后开始跳转到第二个Activity
IntentActivity.this.startActivityForResult(intent, );
// 第二个参数为requestCode,大于或等于0, }
}); bt2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(IntentActivity.this,
requestCodetest.class);//将intent绑定在第三个activity
IntentActivity.this.startActivityForResult(intent, ); }
}); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {// 通过requestCode来辨别数据来自哪个activity
case :// 取得来自Activity2的数据,并显示于画面上
switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法 case : String resultstr1 = data.getStringExtra("result");// 取出传回来的数据
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(resultstr1);// 显示出来 break;
case : String resultstr2 = data.getStringExtra("result");
TextView tv1 = (TextView) findViewById(R.id.tv);
tv1.setText(resultstr2);
Toast.makeText(this,
"第2个activity的requestCode的值为" + requestCode,
Toast.LENGTH_LONG).show(); break;
default:
break;
}
break;
case :
switch (resultCode) {
case RESULT_OK: String resultstr3 = data.getStringExtra("result3");
Toast.makeText(this,
"第3个activity的requestCode的值为" + requestCode,
Toast.LENGTH_LONG).show();
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(resultstr3); break;
default:
break;
}
default:
break; } }
}
//secondactivity为第二个activity
package conowen.Activity.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 secondactivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity); // 获取启动这个activity的intent
Button returnbt1 = (Button) findViewById(R.id.returnbt1);
final Intent intent = getIntent();
returnbt1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub EditText et = (EditText) findViewById(R.id.et);
String res = et.getText().toString();
intent.putExtra("result", res);// 把数据塞入intent里面
secondactivity.this.setResult(, intent);// 跳转回原来的activity
secondactivity.this.finish();// 一定要结束当前activity }
});
Button returnbt2 = (Button) findViewById(R.id.returnbt2);
returnbt2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub intent.putExtra("result", "验证result code");
secondactivity.this.setResult(, intent);
secondactivity.this.finish();
}
}); } }
//requestCodetest是第三个activity package conowen.Activity.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 requestCodetest extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.requestcode);// layout的xml文件名不能为大写字母 Button bt3 = (Button) findViewById(R.id.returnbt3); bt3.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 这个activity主要是为了验证requestCode
EditText et3 = (EditText) findViewById(R.id.et3);
Intent intent = getIntent();// 获取启动这个activity的intent
String res = et3.getText().toString();
intent.putExtra("result3", res);
requestCodetest.this.setResult(RESULT_OK, intent);
requestCodetest.this.finish(); }
}); } }
via:http://blog.csdn.net/conowen/article/details/7292246
从零开始学android开发-详细谈谈intent的startActivityForResult()方法的更多相关文章
- 从零开始学android开发-View的setOnClickListener的添加方法
1)第一种,也是最长见的添加方法(一下都以Button为例) Button btn = (Button) findViewById(R.id.myButton); btn .setOnClickLis ...
- 从零开始学android开发-用Intent启动Activity的方法
启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new ...
- 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现
相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...
- 从零开始学android开发-adt-bundle-eclipse下的修改android app名称
eclipse中,打开项目根目录中的AndoirManifest.xml文件,找到如下内容 <application android:allowBackup="true" a ...
- 从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature
我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. 首先介绍一个重要方法那就是requestWindowFeat ...
- 从零开始学android开发-四大组件之一 Activity
1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的, ...
- 从零开始学android开发-创建第一个android项目
打开ADT开发工具
- 从零开始学android开发-项目打包发布
右键项目 选择[android tools]-[export signed application package] 点击[next] 如果没有keystore可以选择[create new keys ...
- 从零开始学android开发-通过WebService获取今日天气情况
因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行 ...
随机推荐
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- 宏ut_2pow_remainder
求余数 12%8=4 n%m也能计算出余数,但效率可能比位操作要低一些 /*************************************************************// ...
- [原]Unity3D深入浅出 - 新版动画系统(Mecanim)
Mecanim概述: Mecanim是Unity提供第一个丰富而复杂的动画系统,提供了: 针对人形角色的简易的工作流和动画创建能力 Retargeting(运动重定向)功能,即把动画从一个角色模型应用 ...
- [ZOJ 2836] Number Puzzle
Number Puzzle Time Limit: 2 Seconds Memory Limit: 65536 KB Given a list of integers (A1, A2, .. ...
- Spring depends-on介绍
<!-- redis配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.Jedis ...
- shell编程——if语句 if -z -n -f -eq -ne -lt
if 条件then Commandelse Commandfi 别忘了这个结尾 If语句忘了结尾fitest.sh: line 14: sy ...
- 多线程程序设计学习(6)Producer-Consumer模式
Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...
- 文件上传利器JQuery上传插件Uploadify
在做日常项目中,经常在后台需要上传图片等资源文件,之前使用过几次这个组件,感觉非常好用 ,但是每次使用的时候都是需要经过一番查阅,所以还不如记住在这里,以后使用的时候就翻翻. 他的官方网站如下:htt ...
- [面试题] BloomFilter 无序40亿不重复 uint 整数, 给予任意的数,求是否在这40亿之中 + 无序数组中找2个相同的值
一道百度面试题(待解中) 具体:给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中? 分析下,首先应该是空间复杂度(40亿uint ...
- SGU 134 Centroid
题意:给出一个树,每个点有一个value,value的意义是去掉这个点之后所有连通分量中点最多的那个连通分量的点数,这棵树的重心为所有点value的最小值,求重心,及重心都有谁. 解法:貌似是个树形d ...