从零开始学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 >= 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的标识,

IntentActivity.this.startActivityForResult(intent, 15);

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

IntentActivity.this.startActivityForResult(intent, 25);

(通过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 15:
            switch (resultCode) {
            case 0:
                //do something

                break;
            case 1:
                //do something

                       break;
            default:
                break;
            }
            break;
        case 25:
            switch (resultCode) {
            case 0:
                 //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(0, intent);
                secondactivity.this.finish();

            }
        });

        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                //do something
                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) {
            case 0:
                //do something

                break;
            case 1:
                //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, 15);
                // 第二个参数为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, 25);

            }
        });

    }

    @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 15:// 取得来自Activity2的数据,并显示于画面上
            switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法

            case 0:

                String resultstr1 = data.getStringExtra("result");// 取出传回来的数据
                TextView tv = (TextView) findViewById(R.id.tv);
                tv.setText(resultstr1);// 显示出来

                break;
            case 1:

                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 25:
            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(0, 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(1, 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

时间: 2024-10-10 02:08:35

从零开始学android开发-详细谈谈intent的startActivityForResult()方法的相关文章

从零开始学android开发-View的setOnClickListener的添加方法

1)第一种,也是最长见的添加方法(一下都以Button为例) Button btn = (Button) findViewById(R.id.myButton); btn .setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //do something } }); 2)第二种,下面这个方法较前一种稍微简单了一些,允许多个Buttons共享一个Listener.通过Switch控制对不同But

从零开始学android开发-用Intent启动Activity的方法

启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new Intent(); intent.setClass(this, CreatePlaylist.class) //参数一为当前Package的context,t当前Activity的context就是this,其他Package可能用到createPackageContex()参数二为你要打开的Ac

从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现

相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人很喜欢服务器给我们返回JSON数据格式,因为他解析方便,也有一些JSON的解析库,例如Google提供的GSON,阿里巴巴的FastJson,不过还是推荐大家使用FastJson来解析,我自己开发中也是用FastJson来解析,FastJson的介绍http://code.alibabatech.c

从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature

我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. 首先介绍一个重要方法那就是requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性.参数是Window类中定义的常量. 一.枚举常量 1.DEFAULT_FEATURES:系统默认状态,一般不需要指定 2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定 3.FEATURE

从零开始学android开发-四大组件之一 Activity

1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的,但也可以是一个小的位于其它Activity之上的浮动窗口.一个Android工程至少有一个Activity,Activity上面可布有多个view的实例,如文本框.进度条.复选框.按钮等等.多个Activity之间通过Intent来实现跳转. 注:每新建一个activity,就要继承(extends

从零开始学android开发-通过WebService获取今日天气情况

因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行网络编程,使用工具类轻松实现这篇博客,还是实现了通过一个公开的WebService获取今日天气情况这么一个功能.实现效果如下: 有时候我们需要用到WebService接口来获取数据,WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不

从零开始学android开发-Json转换利器Gson之实例

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: public class Student { private int id; private String name; private Date birthDay; public int

从零开始学android开发-获取TextView的值

昨日写一个Android Demo,逻辑大概是从TextView获取其中的值,然后处理后再放回TextView中.整个处理过程是由一个Button的OnClick触发的. 可是在调试的过程中,一点击Button就出force close对话框,看了好半天才发现了问题所在,原来是数据类型转换的异常 原先的代码: String number = (String)text_number.getText(); 更改后的代码: String number = text_number.getText().t

从零开始学android开发-setBackgroundDrawable与setBackgroundResource的区别

setBackgroundDrawable和setBackgroundResource的区别很多网友不知道View类提供的setBackgroundDrawable和setBackgroundResource的区别是什么,同时Android View类很多子类比如TextView.ImageView中都有这些方法,同时还有一些类似setImageDrawable.setImageBitmap和setImageResource()这些方法的不同之处. 一.setBackgroundXXX的用处,设