Android - startActivityForResult löst sofort onActivityResult aus

144

Ich starte Aktivitäten über die Hauptaktivität in meiner App mithilfe des Anrufs startActivityForResult(intent, ACTIVITY_TYPE), und alle funktionieren bis auf eine.

Wenn dieser aufgerufen wird, wird die Aktivität wie gewünscht gestartet, aber im Protokoll kann ich sehen, dass sie onActivityResult()sofort ausgelöst wird. Die Aktivität wird angezeigt, aber RESULT_CANCELEDsofort wieder angezeigt onActivityResult().

Ich interagiere dann mit der Aktivität, drücke eine Taste, die anruft finish()und onActivityResult()diesmal nicht aufgerufen wird (weil anscheinend bereits ein Ergebnis zurückgegeben wurde).

Ist das für jemanden sinnvoll? Hat jemand dieses Verhalten schon einmal gesehen?

TomBomb
quelle

Antworten:

315

Sie können nicht verwenden, startActivityForResult()wenn Ihre Aktivität als singleInstanceoder gestartet wird singleTask. standardoder singleTopStartmodus wird das Problem beheben.

Falmarri
quelle
2
Ich danke Ihnen beiden, ich hatte dies in meiner Manifest-Datei und hatte es völlig vergessen
TomBomb
9
BEEINDRUCKEND! Dies scheint eine naheliegende Sache zu sein, um die Javadocs hinzuzufügen! Ich habe einen ganzen Abend damit verbracht, dies zum Laufen zu bringen, und diese SO-Antwort erinnerte mich daran, dass meine Aktivität auf singleTop eingestellt war.
Swooby
20
singleTopscheint in Ordnung für mich zu sein, singleTaskverursachte jedoch dieses Problem und singleInstancewürde es definitiv auch tun
darnmason
4
Ich habe auch viel zu lange damit verbracht, dies zu debuggen! Vielen Dank!!
Suomi35
4
In meinem Fall hat keine Klasse als singleInstance oder singleTop definiert, aber es passiert immer noch ... irgendein Vorschlag?
CoDe
110

Stellen Sie außerdem sicher, dass die Absicht nicht Intent.FLAG_ACTIVITY_NEW_TASKfestgelegt ist.

Aus den Dokumenten :

Dieses Flag kann nicht verwendet werden, wenn der Anrufer ein Ergebnis der gestarteten Aktivität anfordert.

James Zhang
quelle
3
Dies hat das Problem in meinem Fall behoben. Das Problem wurde nicht durch singleInstance, singleTop oder singleTask verursacht.
Diana
Du bist eine Münze (ein Lebensretter). Dies war genau mein Problem, als ich wollte, dass der Benutzer ein Bild in einem Fragment
aufnimmt
@ Diana, erinnerst du dich, was du stattdessen verwendet hast Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme
@Keselme Sorry, es ist lange her, ich wünschte ich könnte helfen, aber ich erinnere mich nicht und ich kann nicht mehr auf diesen Code zugreifen.
Diana
Ja, es wurde behoben. startActivityForResult sollte nicht mit Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen
21

Ich habe dieses Verhalten bereits gesehen. Stellen Sie sicher, dass Ihre Destnationsaktivität (diese spezielle Aktivität) nicht singleInstancein der AndroidManifest-Datei enthalten ist. Wenn die Aktivität aktiviert ist singleInstance, wird sie RESULT_CANCELEDvor dem Start zurückgegeben!

Pangcong
quelle
18

Ich möchte auch hinzufügen, dass Sie eine externe App aufrufen können mit:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Was würde eine Absicht mit Intent.FLAG_ACTIVITY_NEW_TASKstandardmäßig hinzugefügt erzeugen , also rufen Sie an:
in.setFlags(0);
Was löscht dieses Flag, und dann können Sie fortfahren mit:startActivityForResult(in, action);

Der Grund dafür ist, dass ich eine Utility-App habe, die gemeinsame Funktionen für einige andere Apps bietet, und die Codeänderungen an einem Ort speichern kann, anstatt mir Gedanken über mehrere Updates zu machen.

giannileuani
quelle
Ich weiß, dass dies alt ist, aber das war für mich so absolut von unschätzbarem Wert, dass ich mich beim Benutzer bedanken und für jeden, der zwischen Aktivitäten springt, darauf hinweisen möchte, dass dies verdammt Gold ist! Rettete meinen Arsch während eines Hackathons;)
Wes Winn
Dies erfordert mehr Aufmerksamkeit. Es ist die beste Lösung und funktioniert perfekt für mich. Du hast mir viel Zeit gespart, vielen Dank.
Aritra Roy
Diese Antwort zu verbessern, da dies genau das Problem war, das ich heute Morgen hatte! Danke für die Lösung!
Will Johnson
Vielen Dank. intent.setFlags (0) hat das Problem gelöst. Jetzt startet die zweite App in Ordnung und gibt das Ergebnis an die aufrufende App zurück
Niaz
5

startActivityForResult()funktioniert nicht mit einer singleInstanceoder singleTaskAktivität in der Pre-Lollipop-Version von Android. Seit Android 5 funktioniert es (siehe diese Antwort für weitere Details).

Noelicus
quelle
5

Es wird auch ausgelöst, wenn Sie FLAG_ACTIVITY_NEW_TASKin Ihrer Absicht haben.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
Roger Alien
quelle
Vielen Dank. Ich habe FLAG_ACTIVITY_NEW_TASK zu meiner Aktivität hinzugefügt.
Chirag Savsani
1

Mein Problem war mit der anrufenden Aktivität. Die Deklaration im AndroidManifest hatte folgende Eigenschaft:

android:noHistory="true"

Es wurde in "false" geändert und funktioniert jetzt einwandfrei.

user3829751
quelle
1

Android 4.4 hat ein kleines Problem beim Warten auf die Rückkehr am Ende des Aktivitätsabschlusses. Um dieses Verhalten zu lösen, ist Folgendes wichtig:

  • Alle Aktivitäten haben das gleiche Aufgabenaffinitätsattribut. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Diese Lösung funktioniert mit allen Android-Versionen

Siehe dies für taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072

Andrea Falappi - Polipo
quelle
1

Überprüfen Sie auch, ob android: noHistory = "true" für Aktivitäten in Manifest ist. Wenn ja, funktioniert dies nicht.

Sanju
quelle
0

Für ActivityGroupoder TabHostund andere ist das vielleicht xxxActivityeines subActivityseiner Eltern. Dann startActivityForResultkann das nicht funktionieren, aber der Elternteil kann das Ergebnis erhalten.

  1. Anruf getParent().startActivityForResult()von Ihrer Unteraktivität

  2. Ihr Elternteil (der ActivityGroup) wird in der Lage sein, das zu handhaben onActivityResult. Also habe ich eine Unterklasse von erstellt ActivityGroupund damit umgegangen onActivityResult.

  3. Sie können das Ergebnis bei Bedarf zurück zur Unteraktivität leiten. Holen Sie sich einfach die aktuelle Aktivität von getLocalActivityManager().getCurrentActivity(). Meine Unteraktivitäten erben von einer benutzerdefinierten Aktivität, daher habe ich handleActivityResult(requestCode, resultCode, data)in dieser Unterklasse eine hinzugefügt , die ActivityGroupaufgerufen werden soll.

Beispiel: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

fantasaxy025025
quelle
Was halten Sie von diesem Sonderfall, wenn Sie den Standard-Webbrowser anrufen: codeproject.com/Questions/990063/…
Ahmad Ebrahimi
0

onActivityResult()wird auch RESULT_CANCELEDals übergeben, resultCodewenn Sie den Paket- oder Klassennamen in der Manifestdatei falsch schreiben.

Musterjunk
quelle
0

Im Android-Manifest android:launchMode="singleTop"für Aktivität festlegen möchten Sie mit Ergebnis öffnen und beim Öffnen des Aktivitäts-Set-Flagsintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Krish
quelle
0

Wenn Sie android:noHistory="true"in der Aktivität in Ihrer AndroidManifest.xml definiert haben, verursacht dies hier das gleiche Problem.

Yu-Long Chen
quelle