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.
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.
źródło
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();
źródło
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.
źródło