Używając startActivityForResult, jak uzyskać requestCode w działaniu podrzędnym?

85

Mam cztery działania, powiedzmy A, B, C i D. Moja sytuacja to A rozpocznie działanie B przez startActivityForResult.

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

W innej sytuacji będę B z inną sytuacją. lubić

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

W B muszę zadzwonić do C lub D w zależności od requestCode. To znaczy, jeśli JEDEN musi rozpocząć C else D.
Więc muszę wiedzieć, jak sprawdzić requestCode w działaniu podrzędnym (tutaj B).
Innymi słowy, chcę uzyskać kod żądania, od którego rozpoczęto działanie B.

Jithin
źródło

Odpowiedzi:

137

Możesz przekazać kod żądania, umieszczając dodatkowo.

intent.putExtra("requestCode", requestCode);   

Lub jeśli użyto startActivityForResultwiele razy, wtedy lepiej niż każdy edycji, można w twojej , można dodać kod tam tak overridestartActivityForResultActivity

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

Nie ma więc potrzeby edytowania całego startActivityForResult
Mam nadzieję, że to pomogło

Labeeb Panampullan
źródło
49
Czy naprawdę nie ma sposobu, aby działanie podrzędne mogło uzyskać kod żądania?
i_am_jorf
1
Do tej pory, według mojej najlepszej wiedzy, nie sądzę inaczej.
Labeeb Panampullan
17
Zastanawiałem się nad tym samym - to jedna z tych rzeczy w Android API, która nie ma żadnego logicznego sensu.
Artem Russakovskii
7
startActivityForResult może służyć do uruchamiania działań w innych aplikacjach, requestCode to prywatna sprawa Twojej aplikacji. W tym świetle ma to sens, że Intencja nie ma takiej metody, a właściwym podejściem jest ustawienie Akcji, które dokładnie doradzi, co ma robić.
Maciej Beimcik
27

Kod żądania nie jest przekazywany do rozpoczętego działania automatycznie, ponieważ nie musi (i nie powinien) znać tej wartości. Musi tylko wiedzieć, co robić, a nie skąd się zaczęło.

Rozpoczęcie działania jest po prostu kolejną formą wywołania metody. Kiedy wywołujesz metodę, otrzymujesz wynik synchronicznie (dokładnie tam, gdzie wykonałeś wywołanie). W tym przypadku przekazujesz tylko informacje, których metoda potrzebuje do wykonania swojej pracy. Nie mówisz mu, skąd dzwoniłeś.

Rozpoczęcie działania jest asynchronicznym analogiem wywołania metody, w którym to przypadku wynik zostanie uzyskany w specjalnej metodzie onActivityResult (). W tej metodzie musisz wiedzieć, co zrobić z właśnie otrzymanym wynikiem i masz do tego kod żądania.

Aby wyjaśnić nieco, dlaczego przekazywanie kodu żądania jako parametru nie jest dobrym pomysłem, rozważ przykładową czynność, która pokazuje produkt, który można kupić. W tym działaniu znajdują się dwa przyciski oznaczone „Kup” i „Zaloguj się” (ponieważ obecnie nie jesteś zalogowany). Naciśnięcie „Zaloguj” rozpocznie czynność o nazwie „Logowanie”, która spróbuje zalogować użytkownika przy użyciu podanych informacji. Naciśnięcie „Kup” uruchomi najpierw tę samą czynność „Zaloguj się”, a jeśli logowanie się powiodło, rozpocznie czynność kupowania.

Teraz przycisk „Zaloguj się” używa kodu żądania 1 do rozpoczęcia czynności logowania, ale przycisk „Kup” nie może używać tego samego kodu żądania, ponieważ będzie musiał zrobić coś innego, jeśli logowanie się powiedzie. Tak więc przycisk „Kup” używa kodu żądania 2.

W aktywności „Logowanie” możesz otrzymać dwa różne kody żądań w zależności od tego, skąd dzwoniono, ale będziesz musiał wykonać tę samą procedurę.

Tak więc, jeśli przekażesz kod żądania jako parametr, otrzymasz kod, który musi wykonać to samo dla kilku różnych kodów żądań, takich jak:

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

Skończy się również na przechowywaniu stałych kodu żądania w centralnej lokalizacji, np. W klasie o nazwie RequestCodes.

Krótko mówiąc, kod żądania powinien być używany tylko do podjęcia decyzji, co zrobić z otrzymanym wynikiem. W ten sposób otrzymasz bardziej modułowy, łatwiejszy w utrzymaniu i łatwiejszy do rozszerzenia kod.

Szabolcs Berecz
źródło
1
A co, jeśli jest to swego rodzaju „menedżer” i chcesz, aby kod żądania „zapisał” określoną wartość (wartość zapisana w dodatkach). Kolejny kod żądania, który „pobrałby” wartość (i zwróciłby jako dodatki), ale w ramach tego działania może również ogólnie zarządzać zapisanymi wartościami, takimi jak zmiana nazwy, edycja, usuwanie itp. Co myślisz o czymś takim? Myślę, że zapobiegałoby to powielaniu kodu / działań w celu wykonywania tych samych czynności.
JRomero
@ J.Romero Nie rób tego, to tylko skomplikuje sprawę. Po prostu umieść tę funkcjonalność w klasie (użytkowej / pojedynczej). Możesz również spojrzeć na Handler and Service
Szabolcs Berecz
3
Szabolcs Aktywność dziecka, nawet jeśli „nie musi znać tej wartości”, może wymagać przekazania tej wartości następnej czynności w łańcuchu. Jak na ironię, musimy w tym celu napisać więcej nadmiarowego kodu. W przypadku czegoś, czego nie musimy wiedzieć tak dużo, jak otrzymujemy więcej wykładów, aby przeczytać o tym, czego nie powinniśmy robić.
user250343
Nie rozumiem, jak to ilustruje, dlaczego należy odmówić dostępu do kodu żądania aktywności dziecka. Nie jestem nawet pewien, dlaczego dostęp do kodu żądania byłby konieczny w twoim konkretnym przykładzie, biorąc pod uwagę, że połączenia kup teraz i logowanie są i tak do dwóch oddzielnych czynności.
Drazen Bjelovuk
1
@EvanR. być może lepszą architekturą byłoby podklasowanie czynności „głównego” elementu do osobnych czynności dodawania / edycji. Zatem ponowne użycie kodu jest minimalne, ale każde działanie można wywołać niezależnie.
Dane Powell
11

Skończyło się na użyciu niestandardowego działania Intent, aby przekazać tego rodzaju informacje do działania uruchamiającego.

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

Wtedy chciałbyś:

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

W Aktywności Błatwo uzyskasz akcję:

getIntent().getAction();
Marcel Bro
źródło
0

Możesz użyć metody getCallingActivity (), aby pobrać działanie, które rozpoczęło bieżące działanie i które otrzyma wartość wyniku z kodem odpowiedzi na końcu.

Moaz Rashad
źródło