现在的位置: 首页 > 综合 > 正文

startActivityForResult 使用详解

2017年11月18日 ⁄ 综合 ⁄ 共 11904字 ⁄ 字号 评论关闭

Starting Activities and Getting Results

The startActivity(Intent) method
is used to start a new activity, which will be placed at the top of the activity stack. It takes a single argument, an Intent,
which describes the activity to be executed.

Sometimes you want to get a result back from an activity when it ends. For example, you may start an activity that lets the user pick a person in a list of contacts; when it ends, it returns the person that was selected.
To do this, you call the startActivityForResult(Intent,
int)
 version with a second integer parameter identifying the call. The result will come back through your onActivityResult(int,
int, Intent)
 method.

When an activity exits, it can call setResult(int) to
return data back to its parent. It must always supply a result code, which can be the standard results RESULT_CANCELED, RESULT_OK, or any custom values starting at RESULT_FIRST_USER. In addition, it can optionally return back an Intent containing any additional
data it wants. All of this information appears back on the parent's Activity.onActivityResult(), along with the integer identifier it originally supplied.

If a child activity fails for any reason (such as crashing), the parent activity will receive a result with the code RESULT_CANCELED.

 public class MyActivity extends Activity {
     ...

     static final int PICK_CONTACT_REQUEST = 0;

     protected boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
             // When the user center presses, let them pick a contact.
             startActivityForResult(
                 new Intent(Intent.ACTION_PICK,
                 new Uri("content://contacts")),
                 PICK_CONTACT_REQUEST);
            return true;
         }
         return false;
     }

     protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if (requestCode == PICK_CONTACT_REQUEST) {
             if (resultCode == RESULT_OK) {
                 // A contact was picked.  Here we will just display it
                 // to the user.
                 startActivity(new Intent(Intent.ACTION_VIEW, data));
             }
         }
     }
 }
 



一个转载的Demo

activity1
  1. <SPAN style="FONT-FAMILY: Microsoft YaHei">package com.android.ActivityGo;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.EditText;  
  10. import android.widget.TextView;  
  11.   
  12. public class Activity1 extends Activity {  
  13.     EditText first,second;  
  14.       
  15.     /** Called when the activity is first created. */  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main1);  
  20.           
  21.         first = (EditText) findViewById(R.id.first);  
  22.         second = (EditText) findViewById(R.id.second);  
  23.           
  24.         findViewById(R.id.start).setOnClickListener(new OnClickListener(){  
  25.             public void onClick(View v) {  
  26.                 // TODO Auto-generated method stub  
  27.                 sendCalculate();  
  28.             }  
  29.         });  
  30.     }  
  31.       
  32.     public void sendCalculate(){  
  33.         Intent i = new Intent(this, Activity2.class);  
  34.           
  35.         Bundle b = new Bundle();  
  36.           
  37.         b.putString("first", first.getText().toString());  
  38.         b.putString("second", second.getText().toString());  
  39.           
  40.         i.putExtras(b);  
  41.           
  42.         startActivityForResult(i,10);  
  43.           
  44.     }  
  45.     @Override  
  46.     protected void onActivityResult(int requestCode, int resultCode,  
  47.                                     Intent data){  
  48. //      10  -1  
  49.         System.out.println(requestCode+">>>>"+resultCode);  
  50.         setTitle(requestCode+">>>>"+resultCode);  
  51.         switch (resultCode){  
  52.         case RESULT_OK:  
  53. //          Bundle b = data.getExtras();  
  54.               
  55. //          String string = b.getString("CALCULATION");  
  56.               
  57.             updateText("55555555555555");  
  58.         }  
  59.     }  
  60.       
  61.     public void updateText(String s){  
  62.         TextView t = (TextView) findViewById(R.id.text);  
  63.         t.setText(s);  
  64.     }  
  65. }</SPAN>  

activity2



  1. <SPAN style="FONT-FAMILY: Microsoft YaHei">package com.android.ActivityGo;  
  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.   
  9. public class Activity2 extends Activity {  
  10.     String value;  
  11.       
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main2);  
  17.           
  18.           
  19.         Intent i = this.getIntent();  
  20.           
  21.         Bundle b = i.getExtras();  
  22.           
  23.         String v1 = b.getString("first");  
  24.         String v2 = b.getString("second");  
  25.           
  26.         value = v1 + v2;  
  27.           
  28.         findViewById(R.id.reply).setOnClickListener(new OnClickListener(){  
  29.             public void onClick(View v) {  
  30.                 // TODO Auto-generated method stub  
  31.                 replyCalculation();  
  32.             }  
  33.         });  
  34.           
  35.     }  
  36.       
  37.       
  38.     public void replyCalculation(){  
  39.         Intent i = new Intent();  
  40.           
  41.         Bundle b = new Bundle();  
  42.         b.putString("CALCULATION", value);  
  43.           
  44.         i.putExtras(b);  
  45.           
  46.         this.setResult(RESULT_OK);  
  47.         this.finish();  
  48.           
  49.     }  
  50. }</SPAN>  

一个小Demo

主界面:

  1. public class StartResultTestActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Button button=(Button) findViewById(R.id.button1);  
  8.         Button button2=(Button) findViewById(R.id.button2);  
  9. //        Intent intent=new Intent(this, cls)  
  10.         button.setOnClickListener(new OnClickListener() {  
  11.               
  12.             public void onClick(View v) {  
  13.                 // TODO Auto-generated method stub  
  14.                 startActivityForResult(new Intent(StartResultTestActivity.this, Activity1.class), 1);  
  15.               
  16.             }  
  17.         });  
  18.         button2.setOnClickListener(new OnClickListener() {  
  19.               
  20.             public void onClick(View v) {  
  21.                 // TODO Auto-generated method stub  
  22.                 startActivityForResult(new Intent(StartResultTestActivity.this, Activity2.class), 2);  
  23.                   
  24.             }  
  25.         });  
  26.     }  
  27. }  

二级页面

  1. public class Activity1 extends Activity{  
  2.         @Override  
  3.         public void onCreate(Bundle savedInstanceState) {  
  4.             super.onCreate(savedInstanceState);  
  5.            setContentView(R.layout.activity1);  
  6.              
  7. //         findViewById(R)  
  8.            Button button=(Button) findViewById(R.id.button11);  
  9.            button.setOnClickListener(new OnClickListener() {  
  10.               
  11.             public void onClick(View v) {  
  12.                 // TODO Auto-generated method stub  
  13. //            Intent intent=new Intent(Activity1.this, StartResultTestActivity.class)   ;  
  14.                 Intent intent=new Intent();  
  15.               setResult(1, intent);  
  16.               finish();//如果不加这句话   这个页面将不会发生跳转到主界面      这句话的本质是:结束当前的 把它从activity的栈顶中移除    
  17.             }  
  18.         });  
  19.              
  20.      }  
  21. }  




 

二十二、startActivityForResult用法详解

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

复制代码
package com.ljq.activitys; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private final static String TAG="MainActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnOpen=(Button)this.findViewById(R.id.btnOpen); btnOpen.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //得到新打开Activity关闭后返回的数据 //第二个参数为请求码,可以根据业务需求自己编号 startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1); } }); } /** * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法 * * requestCode 请求码,即调用startActivityForResult()传递过去的值 * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据 Log.i(TAG, result); } }
复制代码

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

                    

二、使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

复制代码
package com.ljq.activitys; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.other); Button btnClose=(Button)findViewById(R.id.btnClose); btnClose.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //数据是使用Intent返回 Intent intent = new Intent(); //把返回数据存入Intent intent.putExtra("result", "My name is linjiqin"); //设置返回数据 OtherActivity.this.setResult(RESULT_OK, intent); //关闭Activity OtherActivity.this.finish(); } }); } }
复制代码

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:
public class android.app.Activity extends ......{
  public static final int RESULT_CANCELED = 0;
  public static final int RESULT_OK = -1;
  public static final int RESULT_FIRST_USER = 1;
}

运行结果

     

说明:当点击“打开新的Activity”按钮,会跳转到“我是新打开的Activity”页面;

        当点击“关闭”按钮,关闭当前页面,同时跳转到“我是旧的Activity”页面,且会传递result参数给前一个Activity

                         

   

请求码的作用                

使用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) {
        ....
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);

           }

        });
        button2.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                 startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);

            }

        });

                         
       @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
               switch(requestCode){
                   case 1:
                   //来自按钮1的请求,作相应业务处理
                   case 2:
                   //来自按钮2的请求,作相应业务处理
                }
          }
}
             

                    

结果码的作用

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
public class ResultActivity extends Activity {
       .....
       ResultActivity.this.setResult(1, intent);
       ResultActivity.this.finish();
}
public class NewActivity extends Activity {
       ......
        NewActivity.this.setResult(2, intent);
        NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
       @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
               switch(resultCode){
                   case 1:
                   // ResultActivity的返回数据
                   case 2:
                    // NewActivity的返回数据
                }
          }

抱歉!评论已关闭.