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.
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
Und ich denke, ich bin nicht so sicher, wo der Anfragecode verwendet wird .... – javapalava
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. –