2013-08-14 6 views
8

ich eine Anwendung, die diesen Übergang hat:Android- Gehen wir zurück zum vorherigen Aktivität mit verschiedenen Intent Wert

A -> B -> C -> D-> C 

Beim Betreten C, ich habe eine Flagge zu überprüfen. Dann muss ich es als Absicht übergeben (sagen wir) zu . Nachdem Sie etwas in D getan haben, wird es nach dem Drücken einer Taste auf C zurückgehen. Was ich getan habe, war nur wieder die intentX mit Wert True übergeben, dann starten Sie Activity C erneut. Also was passiert ist, dass es eine andere Aktivität C erstellt hat.

Was ich will, ist, dass ich nicht eine neue Aktivität C starten muss, aber verwenden Sie die vorherige C nur super.onBackPressed() aufrufen. Aber ich kann den neuen Wert des intentX nicht übergeben. Gibt es einen anderen Weg, um zu erreichen, was ich will. Ich könnte etwas verpasst haben.

Antwort

13

Was Sie wollen, ist startActivityForResult(). Wenn Sie von C zu gehen, verwenden Sie statt startActivity() stattdessen startActivityForResult(). Wenn Sie dann von D zu C zurückkehren möchten, verwenden Sie setResult(), das ein Intent Objekt mit extras enthalten kann, um zu C zurückzugehen.

Ich empfehle nicht, dies in onBackPressed() zu tun, wenn Sie nicht haben, weil dies nicht das sein wird, was der Benutzer erwartet. Stattdessen sollten Sie mit diesen Daten mit einem Ereignis wie Button klicken.

Also, in C werden Sie so etwas wie

Intent i = new Intent(new Intent(C.this, D.class); 
startActivityForResult(i, 0); 

dann in D tun, wenn Sie bereit sind,

Intent i = new Intent(); 
i.putExtra(); // insert your extras here 
setResult(0, i); 

dann zurückzukehren, wenn Sie C zurückkehren Sie diese Methode (taken from the Docs) eingeben

protected void onActivityResult(int requestCode, int resultCode, 
     Intent data) { 
    if (requestCode == PICK_CONTACT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      // A contact was picked. Here we will just display it 
      // to the user. 
      startActivity(new Intent(Intent.ACTION_VIEW, data)); 

      /* 
       can also get the extra sent back through data 
       using data.getStringExtra("someKey"); 
       assuming the extra was a String 
      */ 

     } 
+0

oh, ich muss es noch einmal versuchen. Ich muss es vorher falsch gebrauchen. – sftdev

+0

Das ist möglich, es ist zunächst leicht zu verstehen, bis Sie verstehen, wie es funktioniert. Dies sollte genug sein, um Sie zu beginnen, aber es gibt auch ein anständiges Beispiel in den Dokumenten, die ich verlinkt und Tutorials und Beispiele auf The Google und SO – codeMagic

+0

Wenn Sie "bereit sind, zurückzukehren" nach dem Einstellen des Ergebnisses - welche Funktion aufgerufen werden sollte ? Soll ich 'finish()' aufrufen? –

1

Es gibt einige Fälle, in denen startActivityForResult nicht wirklich benötigt wird oder es nicht praktisch ist, alle startActivity-Aufrufe für startActivityForResult zu ändern.

Wenn der einfache Fall, nur eine vorherige Aktivität 'wieder' zu starten, benötigt wird, ist meine Empfehlung: Verwenden Sie das Flag FLAG_ACTIVITY_CLEAR_TOP.

Zitiert eine kurze description:

Wenn gesetzt, und die Aktivität gestartet wird, ist bereits in der aktuelle Aufgabe ausgeführt wird, dann anstatt eine neue Instanz dieser Aktivität starten, alle anderen Aktivitäten auf oben wird es geschlossen und diese Absicht wird an die (jetzt oben) alte Aktivität als neue Absicht geliefert werden.

Betrachten Sie zum Beispiel eine Aufgabe, bestehend aus den Aktivitäten: A, B, C, D. Wenn D rufen startActivity(), mit der Absicht, die die Komponente B Aktivität aufgelöst wird, dann C und D werden beendet und B erhält das gegebene Intent, in dem Stapel resultierenden jetzt sind durch: A, B.

So dieses Beispiel

// From ActivityD 
    Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted 
    intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new.. 
    startActivity(intent); 

wo Sie diese neue Absicht erhalten, werden durch den Startmodus und welche Flags definiert, wo verwendet, um es zu starten (in diesem Fall unserer ACTIVITYB).

Die aktuell laufende Instanz Aktivität B in dem obigen Beispiel wird entweder erhalten die neue Absicht, Sie hier in seiner onNewIntent() Methode beginnen, oder dich mit der neuen Absicht beendet und neu gestartet werden. Wenn es seinen Startmodus als "multiple" deklariert hat ( default) und Sie FLAG_ACTIVITY_SINGLE_TOP nicht in der gleichen Absicht gesetzt haben, dann wird es beendet und neu erstellt; für alle anderen Start Modi oder wenn FLAG_ACTIVITY_SINGLE_TOP gesetzt ist dann wird diese Absicht an die aktuelle Instanz onNewIntent() geliefert werden.

Verwandte Themen