牛骨文教育服务平台(让学习变的简单)

安卓Activity之间传数据除了用putExtra之外还可以用startActivityForResult获取一个Activity的返回值。为了简单阐述这种方式我们来做个简单的模型:

假设A去开启B,则调用函数  void startActivityForResult(Intent intent,int requestCode),这时候会设置一个requestCode,要求>=0就行了

这时候A需要覆盖onActivityResult方法获取返回值,这个方法具体是这样的:void onActivityResult(int requestCode,int resultCode,Intent data),requestCode的数值就是刚刚设置的requestCode,resultCode的数值会在B里面设置。这个函数将在B结束后调用。

这时候B需要调用setResult函数设置返回值,这个函数具体是这样的:void setResult(int resultCode,Intent data),第一个参数设置resultCode,这里的resultCode就是onActivityResult的resultCode。

查了一些资料关于这几个函数的调用时机,发现下面这句话总结的很好:

B退回A过程中,首先是B处于Pause 状态,然后等待 执行**restart——〉 start ——〉resume,然后才是B 的stop——〉destroy,而A的 onActivityResult() 需要在Bpause之后,Arestart 之前 这中间调用,所以B中的setResult()函数应该放在B**pause 之前调用。这点非常的重要啊。

下面是代码:

第一个Activity:

package com.example.mytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TextView tv ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);	
		tv = (TextView) findViewById(R.id.tv);

	}
	
	public void click(View v) {
		Intent intent = new Intent(this, NextActivity.class);
		startActivityForResult(intent, 1);
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		String str = data.getStringExtra("data");
		tv.setText(str);
		System.out.println("onActivityResult");
		
	}

}

第二个Activity:

package com.example.mytest;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class NextActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.next_activity);
		Intent intent = new Intent(this  ,MainActivity.class);
		intent.putExtra("data", "传输");
		this.setResult(2, intent);
	}
	
}