67

我有四個活動,說A,B,C和D. 我的情況是一個將被startActivityForResult開始活動B。使用startActivityForResult,如何獲取子活動中的requestCode?

startActivityForResult(new Intent(this,B.class),ONE); 

在其他情況下,我會B與其他情況。像

startActivityForResult(new Intent(this,B.class),TWO); 

在B,我需要調用C或D取決於requestCode。即如果需要啓動C D.其他
所以我需要知道如何(這裏B)檢查在孩子活動的requestCode。
換句話說,我想獲取活動B開始的請求代碼。

回答

109

你可以把多餘的傳遞請求的代碼。

intent.putExtra("requestCode", requestCode); 

或者,如果你已經使用startActivityForResult很多次,然後比編輯每個更好,你可以overrideActivitystartActivityForResult,那裏添加你這樣的代碼

@Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     intent.putExtra("requestCode", requestCode); 
     super.startActivityForResult(intent, requestCode); 
    } 

所以沒有必要編輯您的所有startActivityForResult
希望它對您有所幫助

+33

難道真的沒有辦法了孩子的活動,以獲取其請求碼? – 2011-06-23 00:33:42

+1

直到現在我對最好的知識,我認爲沒有其他辦法。 – 2011-06-23 04:30:57

+11

想知道同樣的事情 - 這是Android API中那些沒有任何邏輯意義的東西之一。 – 2011-07-29 21:34:50

22

請求代碼不會自動傳遞到啓動的活動,因爲它d oesn't(也不應該)需要知道這個值。它只需要知道該做什麼,而不需要從哪裏開始。

開始的活動是真的調用一個方法的另一種形式。當你調用一個方法時,你會同步地收到結果(就在你撥打電話的地方)。在這種情況下,您只傳遞該方法需要完成其工作的信息。你不是在告訴它你從哪裏來的。

啓動一個活動是調用一個方法,在這種情況下會出現在結果的特殊方法的異步模擬onActivityResult()。在這種方法中,你需要知道你剛剛收到的結果該怎麼做,並且你有這個請求代碼。

爲了使它更清楚一點,爲什麼它不是一個好主意傳遞請求代碼作爲參數,考慮該圖是一個產品,你可以買到的例子活動。在此活動中,有兩個按鈕分別標記爲「購買」和「登錄」(因爲您目前尚未登錄)。按「登錄」將啓動名爲「登錄」的活動,該活動將嘗試使用提供的信息登錄用戶。按「購買」將首先啓動完全相同的「登錄」活動,如果登錄成功,則開始購買活動。

現在,「登錄」按鈕使用請求碼1,啓動登錄活動,但「購買」按鈕不能使用相同的請求的代碼,因爲它會做不同的事情,如果登錄成功。所以,「購買」按鈕使用請求代碼2.

在不同的地方它是從叫您可能會收到兩個不同的請求代碼「登錄」的活動,但你需要做的非常相同的程序。

所以,如果你在請求代碼作爲參數傳遞,你將最終需要做同樣的東西了幾個不同的請求代碼,如代碼:

if (requestCode == LOGIN || requestCode == BUY) { 
    // ... 
} else ... 

你也最終將請求代碼常量存儲在一箇中心位置,例如一個名爲RequestCodes的類。

簡而言之,請求代碼只能用於決定如何處理收到的結果。通過這種方式,您將獲得更多模塊化,更易於維護和更容易擴展的代碼。

+1

如果它是一種「經理」,你想要一個請求代碼來「保存」一個特定的值(以額外值保存的值),該怎麼辦?另一個請求代碼可以「檢索」一個值(並返回額外值),但在此活動中,他們還可以全面管理保存的值,如重命名,編輯,刪除等。對於類似的東西,您有什麼想法?我認爲這將防止重複代碼/活動來執行相同的操作。 – JRomero 2012-04-08 22:20:58

+0

@ J.Romero不要這樣做,它會讓事情變得複雜。只需將該功能置於(實用程序/單例)類中即可。你可能還想看看[Handler](http://developer.android.com/reference/android/os/Handler.html)和[Service](http://developer.android.com/reference/android/ app/Service.html) – 2012-04-12 09:38:41

+2

Szabolcs即使「不需要知道該值」的子活動也可能需要將該值傳遞給鏈中的下一個活動。具有諷刺意味的是,我們需要爲此編寫更多的冗餘代碼。對於我們不需要知道的事情,我們可以通過閱讀更多講座來了解我們不應該做什麼。 – user250343 2013-03-08 04:22:54

4

我結束了使用自定義意圖行動傳遞這種信息到啓動活動。

protected static final String ACTION_DO_C = "do_c"; 
protected static final String ACTION_DO_D = "do_d"; 

然後你會去這樣的:

final Intent intent = new Intent(this,B.class) 
intent.setAction(ACTION_DO_C); 
startActivityForResult(intent,ONE); 

而且在活動B你輕鬆搞定的操作:

getIntent().getAction(); 
相關問題