《》我們知道在通過一個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文件中對他們進行配置