/********************************************************************************************
* 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處理。
- public void startActivityForResult (Intent intent, int requestCode)
首先startActivityForResult 有兩個參數,第一個爲當前activity的intent(假設爲activity A),至於第二個參數的用法,還是先看一下官方SDK文檔的解釋
- requestCode : If >= 0, this 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的標識,
- IntentActivity.this.startActivityForResult(intent, 15);
- IntentActivity.this.startActivityForResult(intent, 25);
(通過onActivityResult方法可處理代表不同activity的requestCode數值,詳細用法在第3點。)
3、數據處理方法onActivityResult()詳解
然後activity A通過複寫onActivityResult方法來處理這些activity返回來的數據。onActivityResult定義如下:
- protected void onActivityResult (int requestCode, int resultCode, Intent data)
3.1、數據處理方法onActivityResult()有三個參數,第一個requestCode是用來區分哪個activity回來的數據,可以通過swith語句來篩選。
基本框架代碼如下:
- switch (requestCode) {
- case 15:
- switch (resultCode) {
- case 0:
- //do something
- break;
- case 1:
- //do something
- break;
- default:
- break;
- }
- break;
- case 25:
- switch (resultCode) {
- case 0:
- //do something
- break;
- default:
- break;
- }
- default:
- break;
- }
3.2、第二個參數爲resultCode,也是一個int類型,如果activity B有幾種不同返回的結果,同樣地可以通過resultCode來篩選。
當跳轉到其他activity時,如activity B。需要知道的是,把activity B的數據返回去給activity A的處理方法是setResult (int resultCode, Intent data) ,可以看到它的第一個參數是resultCode,也就是對應着相應的處理方式,官方的推薦取值如下,這些是宏變量,實質是int。當然也可以自定義爲數值,自己習慣就行了。
- RESULT_CANCELED
- RESULT_OK
- RESULT_FIRST_USER
具體做法如下:如你可以在activity B做如下設置,兩個button的監聽器對應着兩個resultCode,也就對應了兩種處理方式,至於你要做什麼事,在監聽器定義即可。
- button1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //do something
- secondactivity.this.setResult(0, intent);
- secondactivity.this.finish();
- }
- });
- button2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //do something
- secondactivity.this.setResult(1, intent);
- secondactivity.this.finish();
- }
- });
3.3、第三個參數爲Intent data,爲activity返回來的數值,如通過data.getStringExtra("key");就可以取出來。
注意:調用setResult()方法跳回原來的activity時,一定要調用finish方法結束當前的activity
另外,如果activity A只需要跳轉到activity B而已,那跳轉時,request code只要大於或者等於0就行,而數據處理的方法onActivityResult()如下結構就行了,不用篩選request code。
- switch (resultCode) {
- case 0:
- //do something
- break;
- case 1:
- //do something
- break;
- default:
- break;
- }
===============================================================================================
附上詳細代碼
從第一個activity跳到第二個,主要是驗證 resultCode,
從第一個activity跳到第三個activity 和跳到第二個activity,主要是驗證requestCode
效果圖:
- //IntentActivity爲第一個activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class IntentActivity extends Activity {
- /** Called when the Activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button bt = (Button) findViewById(R.id.bt);
- Button bt2 = (Button) findViewById(R.id.bt13);
- bt.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(IntentActivity.this,
- secondactivity.class);
- // 將intent綁定到第二個activity,然後開始跳轉到第二個Activity
- IntentActivity.this.startActivityForResult(intent, 15);
- // 第二個參數爲requestCode,大於或等於0,
- }
- });
- bt2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(IntentActivity.this,
- requestCodetest.class);//將intent綁定在第三個activity
- IntentActivity.this.startActivityForResult(intent, 25);
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, data);
- switch (requestCode) {// 通過requestCode來辨別數據來自哪個activity
- case 15:// 取得來自Activity2的數據,並顯示於畫面上
- switch (resultCode) {// 通過resultCode來辨別activity的相應處理方法
- case 0:
- String resultstr1 = data.getStringExtra("result");// 取出傳回來的數據
- TextView tv = (TextView) findViewById(R.id.tv);
- tv.setText(resultstr1);// 顯示出來
- break;
- case 1:
- String resultstr2 = data.getStringExtra("result");
- TextView tv1 = (TextView) findViewById(R.id.tv);
- tv1.setText(resultstr2);
- Toast.makeText(this,
- "第2個activity的requestCode的值爲" + requestCode,
- Toast.LENGTH_LONG).show();
- break;
- default:
- break;
- }
- break;
- case 25:
- switch (resultCode) {
- case RESULT_OK:
- String resultstr3 = data.getStringExtra("result3");
- Toast.makeText(this,
- "第3個activity的requestCode的值爲" + requestCode,
- Toast.LENGTH_LONG).show();
- TextView tv = (TextView) findViewById(R.id.tv);
- tv.setText(resultstr3);
- break;
- default:
- break;
- }
- default:
- break;
- }
- }
- }
- //secondactivity爲第二個activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class secondactivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.secondactivity);
- // 獲取啓動這個activity的intent
- Button returnbt1 = (Button) findViewById(R.id.returnbt1);
- final Intent intent = getIntent();
- returnbt1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- EditText et = (EditText) findViewById(R.id.et);
- String res = et.getText().toString();
- intent.putExtra("result", res);// 把數據塞入intent裏面
- secondactivity.this.setResult(0, intent);// 跳轉回原來的activity
- secondactivity.this.finish();// 一定要結束當前activity
- }
- });
- Button returnbt2 = (Button) findViewById(R.id.returnbt2);
- returnbt2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- intent.putExtra("result", "驗證result code");
- secondactivity.this.setResult(1, intent);
- secondactivity.this.finish();
- }
- });
- }
- }
- //requestCodetest是第三個activity
- package conowen.Activity.intent;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class requestCodetest extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.requestcode);// layout的xml文件名不能爲大寫字母
- Button bt3 = (Button) findViewById(R.id.returnbt3);
- bt3.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- // 這個activity主要是爲了驗證requestCode
- EditText et3 = (EditText) findViewById(R.id.et3);
- Intent intent = getIntent();// 獲取啓動這個activity的intent
- String res = et3.getText().toString();
- intent.putExtra("result3", res);
- requestCodetest.this.setResult(RESULT_OK, intent);
- requestCodetest.this.finish();
- }
- });
- }
- }