天天看點

activity的兩種跳轉方式

1、在一個 Activity 中調用 startActivity()方法。這種方法

2、在一個 Activity 中調用 startActivityRequest()方法。

重寫 onActivityResult 方法,用來接收 B 回傳的資料。

在 B 中回傳資料時采用 setResult 方法,并且之後要調用 finish 方法。

第一種方法簡單直接。但是如果 A 調用 B,并傳遞資料,同時 B 對資料處理後又傳回給 A,A 再将資料顯示

出來。碰到這種情況,用第一種方法需要在 A 的 onCreate()裡面判斷是第一次生成的界面,還是由 B 打開的

A。這樣比較麻煩,用第二種方法就簡單了,在 A 的 onCreate()隻用寫一次生成的界面的内容。在 A 的

onActivityResult 方法裡放 B 處理完資料後的内容就可以了。

下面是第二中方法的具體講解:

1.跳轉的時候不是采用 startActivity(intent) 這個方法,而是 startActivityForResult(Intent intent, Int

requestCode)。

requestCode:請求碼,當 A 調用 startActivityForResult 時,requestCode 會被傳遞到 B 中。

Intent intent=new Intent();

intent.setClass(A.this, B.class);

Bundle bundle=new Bundle();

String str1="aaaaaa";

bundle.putString("str1", str1);

intent.putExtras(bundle);

startActivityForResult(intent, 0);//這裡采用 startActivityForResult 來做跳轉,此處的 0 為一個

依據,可以寫其他的值,但一定要>=0

2.重寫 onActivityResult 方法,用來接收 B 回傳的資料。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (resultCode) { //resultCode 為回傳的标記,我在 B 中回傳的是 RESULT_OK

case RESULT_OK:

Bundle b=data.getExtras(); //data 為 B 中回傳的 Intent

String str=b.getString("str1");//str 即為回傳的值

break;

default:

break;

}

}

3.在 B 中回傳資料時采用(int resultCode, Intent intent)方法,并且之後要調用 finish 方法。

resultCode 結果碼,當 B 調用 finish 方法後,B 會将 resultCode 和開始 A 傳過來的

requestCode 一同傳回給 A。

setResult(RESULT_OK, intent); //intent 為 A 傳來的帶有 Bundle 的 intent,當然也可以自己定義新的 Bundle

finish();//此處一定要調用 finish()方法

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

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

在一個主界面(主 Activity)上能連接配接往許多不同子功能子產品(子 Activity 上去),當子子產品的事情做完之後就回

到主界面,還同時傳回一些子子產品完成的資料交給主 Activity 處理。

用 startActivity 啟動主界面是一個新的 Intent 執行個體,而通路的主界面還在 activity 棧的下面沒有調出來,這樣

做的一個最大的問題是,回不到原界面就不能多個子功能子產品共同來給主界面提供資料或服務了。

目的: A.java 是主界面,B.java 是子功能子產品,要從 A 啟動 B,B 幹完活之後把結果彙報給 A

先看 A.java 的相關代碼

//-- A.java --//

//啟動 B

Intent bintent = new Intent(A.this, B.class);

//設定 bintent 的 Bundle 的一個值

String bsay = "Hello, this is B speaking";

bintent.putExtra("listenB", bsay)

startActivityForResult(bintent,0); // 參數(Intent intent, Int requestCode) 的 requestCode 對應下面回收 Bundle 時識

别用的

//重寫 onActivityResult()來處理傳回的資料,建議先看 B.java 的代碼再回來看這裡比較好了解

//這理有三個參數 requestCode, resultCode, data

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (resultCode) { //resultCode 為回傳的标記,我在 B 中回傳的是 RESULT_OK

case RESULT_OK:

Bundle b=data.getExtras(); //data 為 B 中回傳的 Intent

String str=b.getString("ListenB");//str 即為回傳的值"Hello, this is B speaking"

break;

default:

break;

}

}

-------------------------------------------------------------------------------------

//-- B.java --//

// 用 setResut() 準備好要回傳的資料後,隻要使用 finish()的方法就能把打包好的資料發給 A 且運作

onActivityResult()部分的代碼

Intent aintent = new Intent(B.this, A.class);

setResut(RESULT_OK,aintent); //這理有 2 個參數(int resultCode, Intent intent)

... ...

finish();

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

startActivityForResult(Intent intent, Int requestCode)

intent 傳給 B,requestCode >=0,随便用于在 onActivityResult()差別哪個子子產品回傳的資料,如果還有

C.java ,D 甚至 E 子子產品的話,每個區分開不同的 requestCode 就好。

setResut(int resultCode, Intent intent)

resultCode 如果 B 子子產品可能有幾種不同的結果傳回,可以用這個參數予以識别區分。這裡還有個特殊的

RESULT_OK 值,沒有特殊情況用它就好。

onActivityResult(int requestCode, int resultCode, Intent intent)

這裡三個都不用解釋了,與上文對應的東西。如果不對 requestCode 和 resultCode 加以識别區分的話,隻

要有其他 activity setResult 到了 A onActivityResult()會無差别處理。

繼續閱讀