天天看点

Android学习之使用startActivityForResult()和onActivityResult()进行跳转并返回数据

大家都知道Activity间的跳转可以使用startActivity(),然后传入1个Intent,指定组件即可,然后跳转的那个Activity要返回时,需要再使用一次startActivity(),如果需要传递数据回来,肯定需要用Intent,但是不断地调用startActivity(),每次跳转系统都会在task中生成一个新的Activity实例,并且放于栈结构的顶部,当我按下后退键时,才能看到原来的Activity实例。当然这是在standard启动模式,不管有没有已存在的实例,都生成新的实例。

所以要使用finish()来返回,但是如果我不使用startActivity()也就是不能传入Intent时,我们该怎么把Intent也就是数据传递回去呢?

假设有2个Activity A和B,这时候Activity A就该使用startActivityForResult()了,使用startActivityForResult()的同时必须使用onActivityResult(),顾名思义,就是得到Activity B返回的结果,也就是通过Intent携带的数据,Intent简直是往返两地的高铁啊,呵呵。

怎么使用startActivityForResult()呢,startActivityForResult()需要一个int类型的请求码,这个请求码会随着Activity A的跳转而带过去,而跳转过去的Activity B  finish()的时候,我们需要使用setResult()来设置一个结果码,这个结果码必须为RESULT_OK,因为Activity A的onActivityResult()会依次判断结果码和请求码,只有都符合的时候,OK,我们可以从onActivityResult()的参数Intent data中获取数据啦,这个data就是Activity B中的Intent。

下面是Demo,先看Activity A:

/**
 * 主界面
 *
 * @author yuzhentao
 */
public class MainActivity extends Activity {

    private static final int REQUEST_CODE = 1;

    private Context context;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        initView();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {//如果结果码等于RESULT_OK
            if (requestCode == REQUEST_CODE) {
                String result = data.getExtras().getString("result");
                tv.setText(result);
            }
        }
    }

    private void initView() {
        tv = (TextView) findViewById(R.id.textview_activity_main);
        findViewById(R.id.button_activity_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(context, DemoActivity.class), REQUEST_CODE);//带上requestCode跳转
            }
        });
    }

}      

下面是Activity B:

/**
 * DemoActivity
 *
 * @author yuzhentao
 */
public class DemoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
        initView();
    }

    private void initView() {
        findViewById(R.id.button_activity_demo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("result", "你好,我是返回的数据");
                setResult(RESULT_OK, intent);//设置resultCode
                finish();
            }
        });
    }

}      

最后是效果图:

Android学习之使用startActivityForResult()和onActivityResult()进行跳转并返回数据
Android学习之使用startActivityForResult()和onActivityResult()进行跳转并返回数据
Android学习之使用startActivityForResult()和onActivityResult()进行跳转并返回数据

Demo地址:http://download.csdn.net/detail/qq_23940659/9467070