【原創】Android學習筆記(8)————詳細談談intent的startActivityForResult()方法



/********************************************************************************************
 * author:conowen@大鐘                                                                                                                          
 * E-mail:[email protected]                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 注:本文爲原創,僅作爲學習交流使用,轉載請標明作者及出處。      
 ********************************************************************************************/

1、兩種實現activity跳轉的方法

      實現activity的跳轉主要有兩種方法,startActivity()和startActivityForResult();

例如activity A跳轉到activity B



        對於,第一種,是把activity A的數據,通過intent傳送到activity B,但是不能返回數據。

         關於第一種,可以參考我之前的這篇博文

http://blog.csdn.net/conowen/article/details/7270393

2、第二種方法startActivityForResult()的詳細用法

       今晚談的是第二種方法startActivityForResult();可以實現把activity A數據傳送給activity B,也可以把activity B的數據返回來給activity  A處理。

[java] view plaincopy
  1. public void startActivityForResult (Intent intent, int requestCode)   

           首先startActivityForResult 有兩個參數,第一個爲當前activity的intent(假設爲activity A),至於第二個參數的用法,還是先看一下官方SDK文檔的解釋

[java] view plaincopy
  1. requestCode  :   If >= 0this code will be returned in onActivityResult() when the activity exits.  

             一般都是設置大於或者等於0,因爲activity A可能不單單要跳轉到activity B,也可能跳轉到activity C,D,E……,這些activity返回來的數據都交由activity處理,那activity又通過什麼來分辨返回來的數據到底是哪個activity回來的呢。

         所以在activity A跳轉到某一個activity時,要設定目標activity的requestCode,這個requestCode就唯一地標識了相對應的activity。

如下所示,當要跳轉到activity B時,15表示是activity B的標識,

[java] view plaincopy
  1. IntentActivity.this.startActivityForResult(intent, 15);  
同理,當在activity A的另外一個監聽器要跳轉到activity C時,設定activity C的標識爲25。(大於或者等於0就行了)
[java] view plaincopy
  1. IntentActivity.this.startActivityForResult(intent, 25);  

(通過onActivityResult方法可處理代表不同activity的requestCode數值,詳細用法在第3點。)


3、數據處理方法onActivityResult()詳解


       然後activity A通過複寫onActivityResult方法來處理這些activity返回來的數據。onActivityResult定義如下:

[java] view plaincopy
  1. protected void onActivityResult (int requestCode, int resultCode, Intent data)   


3.1、數據處理方法onActivityResult()有三個參數,第一個requestCode是用來區分哪個activity回來的數據,可以通過swith語句來篩選。


基本框架代碼如下:

[java] view plaincopy
  1. switch (requestCode) {  
  2.         case 15:  
  3.             switch (resultCode) {  
  4.             case 0:  
  5.                 //do something  
  6.   
  7.                 break;  
  8.             case 1:  
  9.                 //do something  
  10.                     
  11.                        break;  
  12.             default:  
  13.                 break;  
  14.             }  
  15.             break;  
  16.         case 25:  
  17.             switch (resultCode) {  
  18.             case 0:           
  19.                 //do something  
  20.                 break;  
  21.             default:  
  22.                 break;  
  23.             }  
  24.                default:  
  25.                         break;  
  26.        }  

3.2、第二個參數爲resultCode,也是一個int類型,如果activity B有幾種不同返回的結果,同樣地可以通過resultCode來篩選。

       當跳轉到其他activity時,如activity B。需要知道的是,把activity B的數據返回去給activity A的處理方法是setResult (int resultCode, Intent data) ,可以看到它的第一個參數是resultCode,也就是對應着相應的處理方式,官方的推薦取值如下,這些是宏變量,實質是int。當然也可以自定義爲數值,自己習慣就行了。

[java] view plaincopy
  1. RESULT_CANCELED  
  2. RESULT_OK  
  3. RESULT_FIRST_USER  

具體做法如下:如你可以在activity B做如下設置,兩個button的監聽器對應着兩個resultCode,也就對應了兩種處理方式,至於你要做什麼事,在監聽器定義即可。


[java] view plaincopy
  1.               button1.setOnClickListener(new OnClickListener() {  
  2.   
  3.     @Override  
  4.     public void onClick(View v) {  
  5.         // TODO Auto-generated method stub  
  6.         //do something  
  7.         secondactivity.this.setResult(0, intent);  
  8.         secondactivity.this.finish();  
  9.   
  10.     }  
  11. });  
  12.   
  13. button2.setOnClickListener(new OnClickListener() {  
  14.   
  15.     @Override  
  16.     public void onClick(View v) {  
  17.         // TODO Auto-generated method stub  
  18.   
  19.         //do something  
  20.         secondactivity.this.setResult(1, intent);  
  21.         secondactivity.this.finish();  
  22.     }  
  23. });  

3.3、第三個參數爲Intent data,爲activity返回來的數值,如通過data.getStringExtra("key");就可以取出來。


注意:調用setResult()方法跳回原來的activity時,一定要調用finish方法結束當前的activity

另外,如果activity A只需要跳轉到activity B而已,那跳轉時,request code只要大於或者等於0就行,而數據處理的方法onActivityResult()如下結構就行了,不用篩選request code。

[java] view plaincopy
  1. switch (resultCode) {  
  2. case 0:  
  3.     //do something  
  4.   
  5.     break;  
  6. case 1:  
  7.     //do something  
  8.                  
  9.                     break;  
  10. default:  
  11.     break;  
  12. }  

===============================================================================================

附上詳細代碼

從第一個activity跳到第二個,主要是驗證 resultCode,

從第一個activity跳到第三個activity 和跳到第二個activity,主要是驗證requestCode

效果圖:


[java] view plaincopy
  1. //IntentActivity爲第一個activity  
  2.   
  3. package conowen.Activity.intent;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.TextView;  
  12. import android.widget.Toast;  
  13.   
  14. public class IntentActivity extends Activity {  
  15.   
  16.     /** Called when the Activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.   
  22.         Button bt = (Button) findViewById(R.id.bt);  
  23.         Button bt2 = (Button) findViewById(R.id.bt13);  
  24.   
  25.         bt.setOnClickListener(new View.OnClickListener() {  
  26.   
  27.             @Override  
  28.             public void onClick(View v) {  
  29.                 // TODO Auto-generated method stub  
  30.                 Intent intent = new Intent(IntentActivity.this,  
  31.                         secondactivity.class);  
  32.                 // 將intent綁定到第二個activity,然後開始跳轉到第二個Activity  
  33.                 IntentActivity.this.startActivityForResult(intent, 15);  
  34.                 // 第二個參數爲requestCode,大於或等於0,  
  35.   
  36.             }  
  37.         });  
  38.   
  39.         bt2.setOnClickListener(new OnClickListener() {  
  40.   
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 // TODO Auto-generated method stub  
  44.                 Intent intent = new Intent(IntentActivity.this,  
  45.                         requestCodetest.class);//將intent綁定在第三個activity  
  46.                 IntentActivity.this.startActivityForResult(intent, 25);  
  47.   
  48.             }  
  49.         });  
  50.   
  51.     }  
  52.   
  53.     @Override  
  54.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  55.         // TODO Auto-generated method stub  
  56.         super.onActivityResult(requestCode, resultCode, data);  
  57.         switch (requestCode) {// 通過requestCode來辨別數據來自哪個activity  
  58.         case 15:// 取得來自Activity2的數據,並顯示於畫面上  
  59.             switch (resultCode) {// 通過resultCode來辨別activity的相應處理方法  
  60.   
  61.             case 0:  
  62.   
  63.                 String resultstr1 = data.getStringExtra("result");// 取出傳回來的數據  
  64.                 TextView tv = (TextView) findViewById(R.id.tv);  
  65.                 tv.setText(resultstr1);// 顯示出來  
  66.   
  67.                 break;  
  68.             case 1:  
  69.   
  70.                 String resultstr2 = data.getStringExtra("result");  
  71.                 TextView tv1 = (TextView) findViewById(R.id.tv);  
  72.                 tv1.setText(resultstr2);  
  73.                 Toast.makeText(this,  
  74.                         "第2個activity的requestCode的值爲" + requestCode,  
  75.                         Toast.LENGTH_LONG).show();  
  76.   
  77.                 break;  
  78.             default:  
  79.                 break;  
  80.             }  
  81.             break;  
  82.         case 25:  
  83.             switch (resultCode) {  
  84.             case RESULT_OK:  
  85.   
  86.                 String resultstr3 = data.getStringExtra("result3");  
  87.                 Toast.makeText(this,  
  88.                         "第3個activity的requestCode的值爲" + requestCode,  
  89.                         Toast.LENGTH_LONG).show();  
  90.                 TextView tv = (TextView) findViewById(R.id.tv);  
  91.                 tv.setText(resultstr3);  
  92.   
  93.                 break;  
  94.             default:  
  95.                 break;  
  96.             }  
  97.         default:  
  98.             break;  
  99.   
  100.         }  
  101.   
  102.     }  
  103. }  


[java] view plaincopy
  1. //secondactivity爲第二個activity  
  2. package conowen.Activity.intent;  
  3.   
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11.   
  12. public class secondactivity extends Activity {  
  13.   
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         // TODO Auto-generated method stub  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.secondactivity);  
  19.   
  20.         // 獲取啓動這個activity的intent  
  21.         Button returnbt1 = (Button) findViewById(R.id.returnbt1);  
  22.         final Intent intent = getIntent();  
  23.         returnbt1.setOnClickListener(new OnClickListener() {  
  24.   
  25.             @Override  
  26.             public void onClick(View v) {  
  27.                 // TODO Auto-generated method stub  
  28.   
  29.                 EditText et = (EditText) findViewById(R.id.et);  
  30.                 String res = et.getText().toString();  
  31.                 intent.putExtra("result", res);// 把數據塞入intent裏面  
  32.                 secondactivity.this.setResult(0, intent);// 跳轉回原來的activity  
  33.                 secondactivity.this.finish();// 一定要結束當前activity  
  34.   
  35.             }  
  36.         });  
  37.         Button returnbt2 = (Button) findViewById(R.id.returnbt2);  
  38.         returnbt2.setOnClickListener(new OnClickListener() {  
  39.   
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 // TODO Auto-generated method stub  
  43.   
  44.                 intent.putExtra("result""驗證result code");  
  45.                 secondactivity.this.setResult(1, intent);  
  46.                 secondactivity.this.finish();  
  47.             }  
  48.         });  
  49.   
  50.     }  
  51.   
  52. }  

[java] view plaincopy
  1. //requestCodetest是第三個activity  
  2.   
  3. package conowen.Activity.intent;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.EditText;  
  12.   
  13. public class requestCodetest extends Activity {  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         // TODO Auto-generated method stub  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.requestcode);// layout的xml文件名不能爲大寫字母  
  20.   
  21.         Button bt3 = (Button) findViewById(R.id.returnbt3);  
  22.   
  23.         bt3.setOnClickListener(new OnClickListener() {  
  24.   
  25.             @Override  
  26.             public void onClick(View v) {  
  27.                 // TODO Auto-generated method stub  
  28.                 // 這個activity主要是爲了驗證requestCode  
  29.                 EditText et3 = (EditText) findViewById(R.id.et3);  
  30.                 Intent intent = getIntent();// 獲取啓動這個activity的intent  
  31.                 String res = et3.getText().toString();  
  32.                 intent.putExtra("result3", res);  
  33.                 requestCodetest.this.setResult(RESULT_OK, intent);  
  34.                 requestCodetest.this.finish();  
  35.   
  36.             }  
  37.         });  
  38.   
  39.     }  
  40.   
  41. }  

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