Android中的onActivityResult和setResult方法的使用



如果你想在Activity中得到新打開Activity關閉後返回的數據,你需要使用系統提供的startActivityForResult(Intent intent,int requestCode)方法打開新的Activity,新的Activity關閉後會向前面的Activity傳回數據,爲了得到傳回的數據,你必須在前面的Activity中重寫onActivityResult(int requestCode, int resultCode,Intent data)方法:

  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. }      
public class MainActivity extends Activity {
      @Overrideprotected void onCreate(Bundle savedInstanceState) {
      Button button =(Button)this.findViewById(R.id.button);
       button.setOnClickListener(new View.OnClickListener(){
//點擊該按鈕會打開一個新的Activity
        publicvoid onClick(View v) {
        //第二個參數爲請求碼,可以根據業務需求自己編號
        startActivityForResult(new Intent(MainActivity.this, NewActivity.class),  1);
    }});
        }
    //第一個參數爲請求碼,即調用startActivityForResult()傳遞過去的值
    //第二個參數爲結果碼,結果碼用於標識返回數據來自哪個新Activity
   @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {
    String result =data.getExtras().getString(“result”));//得到新Activity關閉後返回的數據
    }
}    

當新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是由那個按鈕打開的,並且要做出相應的業務處理,這時可以這樣做:

  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.           }  
@Override  
public void onCreate(Bundle savedInstanceState) {
        ....
        button1.setOnClickListener(newView.OnClickListener(){
      public void onClick(View v) {
           startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 1);
       }});
        button2.setOnClickListener(newView.OnClickListener(){
      public void onClick(View v) {
           startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 2);
       }}); 
       @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {
              switch(requestCode){
                  case 1:
                      //來自按鈕1的請求,作相應業務處理
                  case 2:
                   //來自按鈕2的請求,作相應業務處理
               }
          }

結果碼的作用:用於標示返回結果的來源。

在一個Activity中,可能會使用startActivityForResult()方法打開多個不同的Activity處理不同的業務,當這些新Activity關閉後,系統都會調用前面ActivityonActivityResult(int requestCode, int resultCode, Intentdata)方法。爲了知道返回的數據來自於哪個新Activity,在onActivityResult()方法中可以這樣做(ResultActivityNewActivity爲要打開的新Activity)

  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. }  
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 voidonActivityResult(int requestCode, int resultCode, Intent data) {
              switch(resultCode){
                  case 1:
                      // ResultActivity的返回數據
                  case 2:
                  // NewActivity的返回數據
               }
          }
}

需要返回數據或結果的,則使用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裏面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章