onActivityResult () wird vorzeitig aufgerufen

91

Ich beginne die Activity(Nachkommen von PreferenceActivity) meiner Arbeitstätigkeit wie folgt:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureKlasse hat keine setResult()Anrufe. Tatsächlich hat die MyConfigureKlasse keinen Code, außer OnCreate()wenn sie Einstellungen mit lädt addPreferencesFromResource.

Nun onActivityResultwird mit rief requestCodedie 1458vorzeitig, direkt nach MyConfigureTätigkeit ausgeführt wird. Getestet auf 1.6- und 2.1-Emulatoren sowie 2.1-Geräten. Gibt es einen Anruf, setResult()irgendwo in begraben zu werden PreferenceActivity? Oder wie sonst kann dieser vorzeitige Anruf erklärt werden?

Eugene Mayevskis Rückruf
quelle
1
Eine Aktivität endet nicht mit setResults (), sondern mit finish (). Können Sie die onCreate-Methode Ihrer MyConfigure-Aktivität anzeigen?
Cheryl Simon
Richtig, das tut es nicht. Allerdings ruft etwas setResult () im Voraus auf und ich frage mich, was es ist. Der Code von onCreate ist trivial: öffentliche Klasse MyConfigure erweitert PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski 'Rückruf
Woher willst du wissen, dass setResult heißt?
RoflcoptrException
Genau dafür habe ich die Frage gestellt. Um herauszufinden, warum onActivityResult vorzeitig aufgerufen wird.
Eugene Mayevski 'Rückruf
Was sagt die Logcat-Ausgabe in diesem Zeitraum aus? Insbesondere das Tag "ActivityManager", das anzeigt, welche Absichten aufgerufen werden.
Christopher Orr

Antworten:

254

Dies wird behoben, indem der Startmodus auf Folgendes geändert wird singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Es gibt einen Fehler / eine Funktion (?) In Android, für die sofort das Ergebnis (das noch nicht festgelegt wurde) Activitygemeldet wird, das als singleTask(trotz der Tatsache, dass die Aktivität weiterhin ausgeführt wird) deklariert wurde . Wenn wir launchModedie übergeordnete Aktivität von singleTaskauf ändern singleTop, funktioniert alles wie erwartet - das Ergebnis wird erst nach Abschluss der Aktivität gemeldet. Obwohl dieses Verhalten eine bestimmte Erklärung hat ( singleTaskes kann nur eine Aktivität existieren und es können mehrere Kellner dafür auftreten), ist dies für mich immer noch keine logische Einschränkung.

Eugene Mayevskis Rückruf
quelle
2
Es scheint ein Fehler! ^^ sehr komisches Verhalten!
Felipe
7
Wenn die Aktivität über den SingleTask-Startmodus verfügt, müssen keine Ergebnisse von Unteraktivitäten mit onActivityResult empfangen werden. Unteraktivitäten rufen einfach finish () auf und starten dann die Hauptaktivität mit Datenabsicht. In der Hauptaktivität müssen Sie die onNewIntent-Methode überschreiben und die empfangene Absicht verarbeiten.
Nik
43
launchMode = "singleInstance" verursacht ebenfalls dieses Verhalten
ffleandro
1
Es scheint, dass dies bei mir nicht funktioniert hat. Ich habe singleTop für Elternaktivitäten ausprobiert, aber ohne Erfolg. Ich habe auch das Intent-Flag in FLAG_ACTIVITY_SINGLE_TOP gesetzt, obwohl die Anfrage jetzt den korrekten Wert anzeigt, aber das Ergebnis immer 0 ist.
Neon Warge
11
es passiert auf Kitkat 4.4.4, nicht auf Lolipop.
Somasundaram Mahesh
18

Ich habe mein Problem nach dem Entfernen intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);vor dem Anruf gelöst fragment.startActivityForResult(intent, 0);.

Teapeng
quelle
1
Danke dir! Dies löste mein Problem. Gibt es irgendwo eine Erklärung dafür?
Conner Harkness
In den Dokumenten für das Flag gibt es heutzutage eine Erklärung dafür: "Dieses Flag kann nicht verwendet werden, wenn der Anrufer ein Ergebnis der gestarteten Aktivität anfordert." Nun, es ist keine Erklärung, aber zumindest eine Warnung!
Code Novitiate
4

Ich habe gerade alle meine benutzerdefinierten "android: launchMode" aus meiner Aktivität entfernt und alles hat wie ein Zauber funktioniert. Es ist keine gute Idee, dies zu ändern, wenn Sie nicht genau wissen, was Android versteht ... Android ist auf diese Weise etwas knifflig.

Felipe
quelle
1

Dies geschah mir, als die Absicht die Intent.FLAG_RECEIVER_FOREGROUNDFlagge gesetzt hatte.

(Ja, diese Flagge ist nicht aktivitätsbezogen, aber ich hatte sie in jeder Hinsicht als Teil einer Schrotflintenlösung für ein anderes Problem .)

Sam
quelle
-1

Wieder wie in Mayras Kommentar, setResult()hat nichts mit Ihrem Problem zu tun. Aus irgendeinem Grund MyConfigurebeendet sich die Klasse von selbst und wenn dies geschieht, wird PreferenceActivitynur davon ausgegangen, dass möglicherweise ein Ergebnis daraus resultiert, MyConfigureda Sie den Code so geschrieben haben.

Dies geschieht auch, wenn Sie Aktivitäten zurückzwingen, die mit startActivityForResult()...

Ich denke, es ist besser, sich darauf zu konzentrieren, warum Ihre MyConfigureKlasse gewaltsam beendet wird.

Optimismus
quelle
Die MyConfigure-Klasse wird NICHT beendet. Ihre Vermutungen sind falsch. Wenn es so wäre, gäbe es keine Frage
Eugene Mayevski 'Rückruf