《》我们知道在通过一个Activity启动另一个Activity的时候,可以使用startActivityForResult(Intent intent , int requestCode)方法,也就是说带有返回值的启动方法
使用这种方法的步骤如下:
1、当前的Activity重写onActivityResult(int requestCode , int resultCode , Intent) ,当被启动的Activity返回结果的时候,该方法将会被触发,其中的requestCode 和resultCode都是根据业务自行设置的
2、当前的Activity通过调用starActivityForResult(Intent intent , int requestCode)启动新的Activity
3、被启动的新的Activity需要调用setResult(int resultCode , Intent intent )方法设置将要返回个旧Activity的结果,(将数据封装在Intent中 )
关于带有返回结果的Activity的启动方法参见之前的“Activity的配置、启动和关闭”一文,下面来集中精力来讲一下requestCode 和 resultCode 的使用方法:
requestCode请求码的作用
使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:
@Override public void onCreate(Bundle savedInstanceState) { 2. .... 3. button1.setOnClickListener(new View.OnClickListener(){ 4. public void onClick(View v) { 5. startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); 7. } 9. }); 10. button2.setOnClickListener(new View.OnClickListener(){ 11. public void onClick(View v) { 12. startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2); 14. } 16. }); 19. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { 20. switch(requestCode){ 21. case 1: 22. //来自按钮1的请求,作相应业务处理 23. case 2: 24. //来自按钮2的请求,作相应业务处理 25. } 26. } 27.}
resultCode结果码的作用
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
public class ResultActivity extends Activity { 2. ..... 3. ResultActivity.this.setResult(1, intent); 4. ResultActivity.this.finish(); 5.} 6.public class NewActivity extends Activity { 7. ...... 8. NewActivity.this.setResult(2, intent); 9. NewActivity.this.finish(); 10.} 11.public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity 12. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { 13. switch(resultCode){ 14. case 1: 15. // ResultActivity的返回数据 16. case 2: 17. // NewActivity的返回数据 18. } 19. } 20.}
下面就根据上面的分析写出一个完整的代码
整体上的思路是这样的:
1、总过用四个Activity,分别是:ActivityResult(主Activity)、SecondActivity 、 ThirdActivity 、FourthActivity
2、ActivityResult是主Activity,它的布局文件中安排有一个文本TextView,三个按钮,分别是 button1 , button2 ,button3
3、button1 和 button2 被点击时,都会起动SecondeActivity,但是button1发出的requestCode是 1 , 而button2发出的requestCode是 2 ,
4、button3被点击时,将会同时起动ThirdActivity和FourthActivity , 但是在ThirdActivity的setResult(int resultCode , Intent intent)的resultCode是 5
而FourthActivity的setResult(int resultCode , Intent intent)的resultCode是 6
5、当我们点击不同的button的时候都会最终回调 ActivityResult 的 onActivityResult(int requestCode, int resultCode, Intent data)方法,在这个方法中将会通过对请求
码和结果码的判别 而 更新TextView中显示的内容
ActivityResult.java文件
public class ActivityResult extends Activity { Button button1; Button button2; Button button3 ; TextView textView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3) ; textView = (TextView) findViewById(R.id.textView); button1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(ActivityResult.this ,SecondActivity.class ) ; startActivityForResult(intent , 1) ; } }); button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(ActivityResult.this , SecondActivity.class) ; startActivityForResult(intent , 2) ; } }); button3.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent1 = new Intent(ActivityResult.this , ThirdActivity.class) ; Intent intent2 = new Intent(ActivityResult.this , FourthActivity.class); startActivityForResult(intent1 , 3) ; startActivityForResult(intent2 , 4) ; } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case 1 : textView.setText("SecondActivity是由 按钮one 启动的"); break ; case 2 : textView.setText("SecondActivity是由 按钮two 启动的") ; break ; } switch(resultCode){ case 5 : textView.setText("ThirdActivity返回了结果"); break ; case 6 : textView.setText("FourthActivity返回了结果") ; break ; } super.onActivityResult(requestCode, resultCode, data); } }
SecondeActivity.java文件
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SecondActivity.this.setResult(0,new Intent()); SecondActivity.this.finish(); } }
ThirdActivity.java 文件
public class ThirdActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ThirdActivity.this.setResult(5,new Intent()); ThirdActivity.this.finish(); } }
FourthActivity.java 文件
public class FourthActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FourthActivity.this.setResult(6,new Intent()); FourthActivity.this.finish(); } }
上面的程序中用到了多个Activity,一定记得在Manifest.xml文件中对他们进行配置