startActivityForResult(Intent intent, int requestCode)
onActivityResult(int requestCode, int resultCode, Intent data)
setResult(int resultCode, Intent data)


这三个函数,尤其要注意他们的参数!
现在有两个activity A和B,假如我们从A跳转到B,再B完成相应的工作以后finish掉B,然后传数据给A,A在接受到数据以后做相应的操作。我们可以使用这三个函数:


A:
//启动B
Intent intent = new Intent();
intent.setClass(A.this, B.class);
startActivityForResult(intent, 2);//2是我们自己定义常量,对应下面使用到的resultCode


B:
//do something
setResult(2, null);
finish();


以上主要代码完成后我们需要在A中override onActivityResult()函数:
A:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {


    super.onActivityResult(requestCode, resultCode, data);
    if (2 == requestCode) {
        //do something
    }


}

更详细的:
startActivityForResultonActivityResult
androidActivity之间的跳转不只是有startActivity(Intent i)的,startActivityForResult(Intent intent, int requestCode)也是常用的方法。
其作用是可以用onActivityResult(int requestCode, int resultCode, Intent data)方法获得请求Activity结束之后的操作。
需要注意三个方法:

startActivityForResult(Intent intent, int requestCode),

onActivityResult(int requestCode, int resultCode, Intent data),

setResult(int resultCode, Intent data)

例如如下代码:从From跳转至ToB和ToC
From:
if(条件){
      Intent intent = new Intent(this, ToB.class);
      startActivityForResult(serverIntent, REQUEST_CODE_01);//跳转至ToB
}else{
      Intent intent = new Intent(this, ToC.class);
     startActivityForResult(serverIntent, REQUEST_CODE_02);//跳转至ToC
}

public void onActivityResult(int requestCode, int resultCode, Intent data){
     switch (requestCode) {
             case REQUEST_CODE_01:
                  if(resultCode==Activity.RESULT_OK)
//do something
break;
    case REQUEST_CODE_02:
                   //do something
                  break;
        }
}

这里说说startActivityForResult(Intent intent, int requestCode)的参数,第一个Intent不用说了,需要注意的是第二个,我们用的是REQUEST_CODE_01和REQUEST_CODE_02,其实这个是我们自己定义的一个int型常量,用于标记的,具体作用可在onActivityResult方法里看到,用于判断是从哪个Activity返回的。

ToB:
Intent intent = new Intent();
intent.putExtra(key, value);
setResult(Activity.RESULT_OK, intent);
finish();//结束之后会将结果传回From

ToC:
Intent intent = new Intent();
intent.putExtra(key, value);
setResult(Activity.RESULT_OK, intent);
finish();//结束之后会将结果传回From

setResult的第一个参数对应上面onActivityResult的第二个参数,注意别把onActivityResult的第一个参数与第二个参数搞混淆了,一个是请求标记,一个是返回标记。





Android中的onActivityResult和setResult方法的使用

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode,Intent data)方法:

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.       @Overrideprotected void onCreate(Bundle savedInstanceState) {  
  3.       Button button =(Button)this.findViewById(R.id.button);  
  4.        button.setOnClickListener(new View.OnClickListener(){  
  5. //点击该按钮会打开一个新的Activity  
  6.         publicvoid onClick(View v) {  
  7.         //第二个参数为请求码,可以根据业务需求自己编号  
  8.         startActivityForResult(new Intent(MainActivity.this, NewActivity.class),  1);  
  9.     }});  
  10.         }  
  11.     //第一个参数为请求码,即调用startActivityForResult()传递过去的值  
  12.     //第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity  
  13.    @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {  
  14.     String result =data.getExtras().getString(“result”));//得到新Activity关闭后返回的数据  
  15.     }  
  16. }      

当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面ActivityonActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

请求码的作用:

使用startActivityForResultIntent intent . intrequestcode)方法打开新的activity,我们需要为该方法传递一个请求码。请求码的值是根据业务需要由自已设定,

用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面ActivityonActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:

[java]  view plain copy
  1. @Override    
  2. public void onCreate(Bundle savedInstanceState) {  
  3.         ....  
  4.         button1.setOnClickListener(newView.OnClickListener(){  
  5.       public void onClick(View v) {  
  6.            startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 1);  
  7.        }});  
  8.         button2.setOnClickListener(newView.OnClickListener(){  
  9.       public void onClick(View v) {  
  10.            startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 2);  
  11.        }});   
  12.        @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {  
  13.               switch(requestCode){  
  14.                   case 1:  
  15.                       //来自按钮1的请求,作相应业务处理  
  16.                   case 2:  
  17.                    //来自按钮2的请求,作相应业务处理  
  18.                }  
  19.           }  

结果码的作用:用于标示返回结果的来源。

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面ActivityonActivityResult(int requestCode, int resultCode, Intentdata)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivityNewActivity为要打开的新Activity)

[java]  view plain copy
  1. 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 voidonActivityResult(int requestCode, int resultCode, Intent data) {  
  13.               switch(resultCode){  
  14.                   case 1:  
  15.                       // ResultActivity的返回数据  
  16.                   case 2:  
  17.                   // NewActivity的返回数据  
  18.                }  
  19.           }  
  20. }  

需要返回数据或结果的,则使用startActivityForResult (Intent intent, intrequestCode),requestCode的值是自定义的,用于识别跳转的目标Activity。

跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是onActivityResult(intrequestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android(安卓)TextSwitcher(文字交换器)的使用
  5. 在命令行中通过adb shell am broadcast发送广播通知
  6. 总结Android中的Info系列类
  7. Android(安卓)关于ObjectAnimator 的几种状态
  8. android 获取Bitmap 的两种方法
  9. Android简单模糊背景和圆形ImageView

随机推荐

  1. 自定义ProgressBar的图片
  2. Android(安卓)bundle传递数据简例
  3. Android(安卓)图片压缩的方法大全
  4. android ScreenObserver 实现打开锁屏键
  5. android一种较为复杂的布局参考(xml文件)
  6. Android适配器之------BaseAdapter(例子)
  7. Android(安卓)计算控件尺寸
  8. 九宫格
  9. Android(安卓)左右滑动 控件
  10. Android的按钮按下效果