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_CANCELED
sofort 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?
quelle
singleTop
scheint in Ordnung für mich zu sein,singleTask
verursachte jedoch dieses Problem undsingleInstance
würde es definitiv auch tunStellen Sie außerdem sicher, dass die Absicht nicht
Intent.FLAG_ACTIVITY_NEW_TASK
festgelegt ist.Aus den Dokumenten :
quelle
Intent.FLAG_ACTIVITY_NEW_TASK
?Ich habe dieses Verhalten bereits gesehen. Stellen Sie sicher, dass Ihre Destnationsaktivität (diese spezielle Aktivität) nicht
singleInstance
in der AndroidManifest-Datei enthalten ist. Wenn die Aktivität aktiviert istsingleInstance
, wird sieRESULT_CANCELED
vor dem Start zurückgegeben!quelle
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_TASK
standardmäß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.
quelle
startActivityForResult()
funktioniert nicht mit einersingleInstance
odersingleTask
Aktivität in der Pre-Lollipop-Version von Android. Seit Android 5 funktioniert es (siehe diese Antwort für weitere Details).quelle
Es wird auch ausgelöst, wenn Sie
FLAG_ACTIVITY_NEW_TASK
in Ihrer Absicht haben.quelle
Mein Problem war mit der anrufenden Aktivität. Die Deklaration im AndroidManifest hatte folgende Eigenschaft:
Es wurde in "false" geändert und funktioniert jetzt einwandfrei.
quelle
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:
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
quelle
Überprüfen Sie auch, ob android: noHistory = "true" für Aktivitäten in Manifest ist. Wenn ja, funktioniert dies nicht.
quelle
Für
ActivityGroup
oderTabHost
und andere ist das vielleichtxxxActivity
einessubActivity
seiner Eltern. DannstartActivityForResult
kann das nicht funktionieren, aber der Elternteil kann das Ergebnis erhalten.Anruf
getParent().startActivityForResult()
von Ihrer UnteraktivitätIhr Elternteil (der
ActivityGroup
) wird in der Lage sein, das zu handhabenonActivityResult
. Also habe ich eine Unterklasse von erstelltActivityGroup
und damit umgegangenonActivityResult
.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 ichhandleActivityResult(requestCode, resultCode, data)
in dieser Unterklasse eine hinzugefügt , dieActivityGroup
aufgerufen werden soll.Beispiel: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html
quelle
onActivityResult()
wird auchRESULT_CANCELED
als übergeben,resultCode
wenn Sie den Paket- oder Klassennamen in der Manifestdatei falsch schreiben.quelle
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);
quelle
Wenn Sie
android:noHistory="true"
in der Aktivität in Ihrer AndroidManifest.xml definiert haben, verursacht dies hier das gleiche Problem.quelle