2016-08-03 14 views
2

Ich habe zwei Aktivitäten - Aktivität A und Aktivität B. Dem Benutzer wird Aktivität A beim Öffnen der App angezeigt.Senden von Daten zwischen zwei Aktivitäten mithilfe expliziter Intents

Wenn Sie eine Taste auf Aktivität A klicken, öffnet es Activity B.

In Aktivität B wird der Benutzer aufgefordert, einen Text in ein EditText Feld hinzuzufügen, die in einem Textview-Objekt gespeichert wird.

Wenn Sie auf eine Schaltfläche in Aktivität B klicken, werden Sie zu Aktivität A weitergeleitet und übergibt die im TextView-Objekt gespeicherten Daten an Aktivität A zur Anzeige auf dem Bildschirm.

Meine angenommene Logik:

Aktivität A erstellt ein neues Intent und geht in Aktion B.

Aktivität A ruft startActivityForResult (Vorsatz).

Aktivität B ruft dann getIntent(), aber tut nichts damit, weil es nichts erforderlich (?)

In onClick() -Methode, Aktivität B erstellt eine neue Intent, in Aktivität A. vorbei Aktivität B setzt seine Ergebnisse in die neue Absicht (dh mit intent.putExtra())

onActivityResult() in Aktivität A wird aufgerufen.

Ich frage mich, ob das die richtige Logik ist?

Antwort

3

Ja, Sie tun die Dinge genau so, wie Sie es erwarten. Es mag ein wenig seltsam erscheinen, Daten über Absichten zu übertragen, aber so wurde Android entworfen. Denken Sie daran, dass Aktivitäten in verschiedenen Prozessen stattfinden können, sodass das System die Daten serialisiert und deserialisiert, um die Kommunikation zwischen den Prozessen durchzuführen. Der Intent-Mechanismus ist die Standardmethode zum Austausch von Informationen über sie hinweg, weshalb Intents nur primitive Daten, Parcelables und Serialisables enthalten. Das heißt, ein Datenstück, das durch eine Absicht ausgetauscht wird, ist niemals die gleiche Instanz auf beiden Seiten, sondern eine tatsächliche Kopie der Originaldaten.

+0

Danke Flavio - Ich glaube, ich habe gerade nicht verstanden, warum Aktivität B die Absicht haben muss, aber dann nichts tun und eine neue erstellen? – javapalava

+0

Und ich denke, ich bin nicht so sicher, wo der Anfragecode verwendet wird .... – javapalava

+0

Der Intent hält nicht nur geteilte Informationen. Es enthält Dinge, die es dem System erlauben zu wissen, was die Zielaktivität ist. Es ist in Ordnung, eine leere Absicht zu bekommen. Sie müssen möglicherweise keine Informationen daraus lesen, aber das System musste dies tun, um die Aktivität, die Sie anrufen, zu lösen. –

0

Ihre Logik sieht gut aus, wie von Flavio erwähnt. Ich wollte nur hinzufügen, dass Sie getIntent() in Aktivität B nicht aufrufen müssen, wenn Sie nichts aus Absicht erwarten. Sie können diese Linie vermeiden.

0

Nein, so soll es nicht sein.

Bei der Verwendung von startActivityForResult() muss die Aktivität, die aufgerufen wird (B in Ihrem Beispiel): setResult() vor finish(). Auf diese Weise erhält die aufrufende Aktivität ein Ergebnis.

Von Aktivität B aus müssen Sie nicht getIntent() aufrufen, es sei denn, Sie benötigen einen Parameter oder um zu überprüfen, ob Sie für das Ergebnis aufgerufen wurden.

Lassen Sie uns ein Beispiel machen: FriendsActivity ist eine Aktivität, die Freunde verwalten soll, es zeigt normalerweise die aktuelle Freundesliste und erlaubt das Hinzufügen von mehr.

Von einem Ort Ihrer Anwendung benötigen Sie den Benutzer einen Freund für eine Aktion zu wählen, so haben Sie eine Taste: wählen Freund, die FriendsActivity mit ACTION_PICK und startActivityForResult() öffnen.

All das sieht wie folgt aus:

Intent pickFriendIntent = new Intent(this, FriendsActivity.class); 
pickFriendIntent.setAction(Intent.ACTION_PICK); 
startActivityForResult(pickFriendIntent, REQUEST_PICK_FRIEND); 

Die REQUEST_PICK_FRIEND eine Konstante int in der Anruferaktivität definiert ist (nützlich, wenn Sie mehr als eine Art von Anfrage mit Ergebnis haben).

Von FriendsActivity:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // boolean flag to know if we are requested to pick or not 
    mPickMode = getIntent() != null && Intent.ACTION_PICK.equals(getIntent().getAction()); 
    // etc... 
} 

Die Flagge lassen Sie uns das Verhalten unserer Aktivität modifizieren, um einen Freund zu holen.

Zum Beispiel, wenn ein Freund zu klicken, anstatt auf seinem Profil gehen (oder was auch immer Aktion verwendet wurde vor) wir sollen den Freund Informationen zurückzukehren und die Aktivität zu beenden:

public void onFriendClicked(Friend theFriend) { 
    if (mPickMode) { 
     Intent resultData = new Intent(); 
     // assuming Friend is Parcelable, if not just pass an ID or something 
     // it's usually best to handle this with a custom Uri actually 
     resultData.putExtra("friendParcelable", theFriend); 
     // here we set the result for the calling activity 
     setResult(RESULT_FRIEND_PICKED, resultData); 
     // and then we finish this one 
     finish(); 
    } else { ... } 
} 

Die RESULT_FRIEND_PICKED ist ein int konstant, normalerweise öffentlich. Es zeigt an, welche Art von Ergebnis mit der übergeordneten Aktivität passiert ist, Sie können mehr als eins für Ihre Bedürfnisse haben. Es ist auch eine gute Idee, um öffentliche Konstanten für Extras, wie "friendParcelable" im obigen Beispiel zu machen.

Wenn die FriendsActivity die Anrufer erhalten den Rückruf beenden:

protected void onActivityResult (int requestCode, 
      int resultCode, 
      Intent data) { 
    if (requestCode == REQUEST_PICK_FRIEND) { 
     if (resultCode == FriendsActivity.RESULT_FRIEND_PICKED) { 
      Friend pickedFriend = data.getParcelableExtra("friendParcelable"); 
      // do whatever you want with that information 
     } else if (resultCode == Activity.RESULT_CANCELED) { 
      // the FriendsActivity terminated without calling setResult(); 
     } 
    } 
} 

Beachten Sie auch, dass es nicht zwingend notwendig ist finish() direkt nach setResult() zu nennen. Wenn Sie setResult() aufrufen und den Benutzer dann zurückklicken lassen, wird das Ergebnis wieder angezeigt. Wenn jedoch nach dem Aufruf an setResult() die Aktivität zerstört und neu erstellt wird (zB Gerätedrehung), müssen Sie erneut setResult() aufrufen.

Verwandte Themen