Wie kann ich mit startActivityForResult requestCode in untergeordneten Aktivitäten abrufen?

84

Ich habe vier Aktivitäten, z. B. A, B, C und D. Meine Situation ist, dass A die Aktivität B mit startActivityForResult startet.

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

In einer anderen Situation werde ich B mit einer anderen Situation. mögen

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

In B muss ich je nach requestCode C oder D aufrufen. Dh wenn EINER C sonst D starten muss.
Also muss ich wissen, wie man den requestCode in der untergeordneten Aktivität überprüft (B hier).
Mit anderen Worten, ich möchte den Anforderungscode erhalten, mit dem Aktivität B gestartet wurde.

Jithin
quelle

Antworten:

135

Sie können den Anforderungscode übergeben, indem Sie extra eingeben.

intent.putExtra("requestCode", requestCode);   

Oder wenn Sie verwendet haben startActivityForResultviele Male, dann besser als jeder bearbeiten, können Sie overridedie startActivityForResultin Ihrem Activity, fügen Sie Code dort wie folgt

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

Sie müssen also nicht alle Ihre startActivityForResult bearbeiten. Ich
hoffe, es hat Ihnen geholfen

Labeeb Panampullan
quelle
49
Gibt es wirklich keine Möglichkeit für eine untergeordnete Aktivität, ihren Anforderungscode zu erhalten?
i_am_jorf
1
Nach meinem besten Wissen denke ich bis jetzt nicht anders.
Labeeb Panampullan
17
Ich habe mich das Gleiche gefragt - dies ist eines der Dinge in den Android-APIs, die keinen logischen Sinn ergeben.
Artem Russakovskii
7
startActivityForResult kann verwendet werden, um Aktivitäten in anderen Apps zu starten. requestCode ist die private Angelegenheit Ihrer App. In diesem Licht ist es sinnvoll, dass Intent keine solche Methode hat und der richtige Ansatz darin besteht, setAction festzulegen, um genau anzugeben, was die Aktivität tun soll.
Maciej Beimcik
27

Der Anforderungscode wird nicht automatisch an die gestartete Aktivität übergeben, da dieser Wert nicht bekannt sein muss (und sollte). Es muss nur wissen, was zu tun ist und nicht, wo es gestartet wurde.

Das Starten einer Aktivität ist eigentlich nur eine andere Form des Aufrufs einer Methode. Wenn Sie eine Methode aufrufen, erhalten Sie das Ergebnis synchron (genau dort, wo Sie den Aufruf getätigt haben). In diesem Fall geben Sie nur die Informationen weiter, die die Methode für ihre Arbeit benötigt. Sie sagen nicht, woher Sie es gerufen haben.

Das Starten einer Aktivität ist das asynchrone Analogon zum Aufrufen einer Methode. In diesem Fall erhalten Sie das Ergebnis in der speziellen Methode onActivityResult (). Bei dieser Methode müssen Sie wissen, was mit dem gerade erhaltenen Ergebnis zu tun ist, und Sie haben den Anforderungscode dafür.

Um ein bisschen klarer zu machen, warum es keine gute Idee ist, den Anforderungscode als Parameter zu übergeben, betrachten Sie die Beispielaktivität, in der ein Produkt angezeigt wird, das Sie kaufen können. Bei dieser Aktivität gibt es zwei Schaltflächen mit den Bezeichnungen "Kaufen" und "Anmelden" (da Sie derzeit nicht angemeldet sind). Durch Drücken von "Anmelden" wird eine Aktivität mit dem Namen "Anmelden" gestartet, bei der versucht wird, sich mit den angegebenen Informationen beim Benutzer anzumelden. Durch Drücken von "Kaufen" wird zuerst dieselbe "Anmeldeaktivität" gestartet. Wenn die Anmeldung erfolgreich war, starten Sie die Kaufaktivität.

Jetzt verwendet die Schaltfläche "Anmelden" den Anforderungscode 1, um die Anmeldeaktivität zu starten. Die Schaltfläche "Kaufen" kann jedoch nicht denselben Anforderungscode verwenden, da bei erfolgreicher Anmeldung etwas anderes ausgeführt werden muss. Die Schaltfläche "Kaufen" verwendet also den Anforderungscode 2.

In der Aktivität "Anmelden" erhalten Sie möglicherweise zwei verschiedene Anforderungscodes, je nachdem, von wo aus sie aufgerufen wurden. Sie müssen jedoch genau das gleiche Verfahren ausführen.

Wenn Sie also den Anforderungscode als Parameter übergeben, erhalten Sie Code, der für einige verschiedene Anforderungscodes dasselbe tun muss, z.

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

Am Ende werden Sie auch die Anforderungscodekonstanten an einem zentralen Ort speichern, z. B. in einer Klasse mit dem Namen RequestCodes.

Kurz gesagt, der Anforderungscode sollte nur verwendet werden, um zu entscheiden, was mit dem empfangenen Ergebnis geschehen soll. Auf diese Weise erhalten Sie einen modulareren, einfacher zu wartenden und zu erweiternden Code.

Szabolcs Berecz
quelle
1
Was ist, wenn es sich um eine Art "Manager" handelt und Sie möchten, dass ein Anforderungscode eingeht, um einen bestimmten Wert (in Extras gespeicherten Wert) zu "speichern". Ein weiterer Anforderungscode, der einen Wert "abruft" (und in Extras zurückgibt), aber innerhalb dieser Aktivität können sie auch die gespeicherten Werte wie Umbenennen, Bearbeiten, Löschen usw. insgesamt verwalten. Was denken Sie über so etwas? Ich denke, es würde verhindern, dass Code / Aktivitäten dupliziert werden, um dieselben Aktionen auszuführen.
JRomero
@ J.Romero Tu das nicht, es wird die Dinge nur komplizieren. Fügen Sie diese Funktionalität einfach in eine (Utility / Singleton) -Klasse ein. Vielleicht möchten Sie auch Handler und Service
Szabolcs Berecz
2
Szabolcs Die untergeordnete Aktivität muss den Wert möglicherweise an die nächste Aktivität in einer Kette weitergeben, auch wenn sie "diesen Wert nicht kennen muss". Ironischerweise müssen wir dafür mehr redundanten Code schreiben. Für etwas, das wir nicht so viel wissen müssen, wie wir mehr Vorträge bekommen, um darüber zu lesen, was wir nicht tun sollten.
user250343
Ich verstehe nicht, wie dies veranschaulicht, warum einer untergeordneten Aktivität der Zugriff auf den Anforderungscode verweigert werden sollte. Ich bin mir nicht einmal sicher, warum der Zugriff auf den Anforderungscode in Ihrem Beispiel in Anbetracht des Kaufs jetzt erforderlich ist und Anmeldeanrufe ohnehin zwei separate Aktivitäten betreffen.
Drazen Bjelovuk
1
@EvanR. Vielleicht wäre eine bessere Architektur, die Aktivität "Master" -Element in separate Aktivitäten zum Hinzufügen / Bearbeiten zu unterteilen. Es gibt also nur eine minimale Wiederverwendung von Code, aber jede Aktivität kann unabhängig aufgerufen werden.
Dane Powell
11

Am Ende habe ich eine benutzerdefinierte Absichtsaktion verwendet, um diese Art von Informationen an die Startaktivität zu übergeben.

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

Dann würden Sie gehen wie:

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

Und in Aktivität erhalten BSie die Aktion leicht:

getIntent().getAction();
Marcel Bro
quelle
0

Mit getCallingActivity () können Sie die Aktivität abrufen, mit der die aktuelle Aktivität gestartet wurde und die am Ende den Ergebniswert mit dem Antwortcode erhält.

Moaz Rashad
quelle