startActivityForResult()

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

	@Override
	protected 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;
		}
	}

	@Override
	public 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_1
		startActivityForResult(intent, requestCode);
	}
    
}


  跳转后的activity

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