setResult funktioniert nicht, wenn die Taste BACK gedrückt wird


90

Ich versuche, SetResult nach dem Drücken der Taste BACK zu drücken. Ich nenne in onDestroy

Intent data = new Intent(); 
setResult(RESULT_OK, data) 

Aber wenn es um

onActivityResult(int requestCode, int resultCode, Intent data) 

kommt die Result 0 (RESULT_CANCELED) und Daten 'null'.

Also, wie kann ich Ergebnis von Aktivität übergeben, die durch BACK-Taste beendet wird?

9

Ich habe meinen Code refaktoriert. Anfangs bereitete ich einige Daten vor und setzte sie als activity result in onDestroy (dies funktionierte nicht). Jetzt setze ich activity Daten jedes Mal, wenn die Daten zurückgegeben werden aktualisiert, und nichts in onDestroy haben.

  0

Dies funktioniert nicht für mich, da meine Daten sind update in "onPause" 22 jul. 122012-07-22 17:49:53

  0

Wenn Ihre Aktivität nach dem Aufruf von 'setResult()' neu erstellt wird, gehen Ihre Daten verloren. 12 mai. 162016-05-12 13:40:41


0

onDestroy ist zu spät in der Kette — statt außer Kraft setzen und überprüfen isFinishing() zu überprüfen, ob Ihre Tätigkeit am Ende seines Lebenszyklus ist.

+1

Nein, das ist auch zu spät. 22 apr. 102010-04-22 03:01:15

+1

Oh, hoppla .. :) 22 apr. 102010-04-22 04:39:11

  0

Ich nenne dies eigentlich einen Fehler: http://code.google.com/p/android/issues/detail?id=1671. In komplexen Anwendungen denke ich, dass es nur ein Verhalten gibt, das man nicht programmieren kann. 16 mär. 112011-03-16 22:21:54

  0

Es ist auch sehr kontraintuitiv. So viel, dass ich denselben Fehler über einen Zeitraum von 2 Jahren mache. 16 mär. 112011-03-16 22:28:31

  0

Eigentlich - das ist noch schlimmer. Und es existiert in JB, während ich codiere. Wenn ich setResult von onPause aus aufrufen, wird es ausgeführt, aber unter resultCode werden keine Daten gesetzt, wenn onActivityReturn ausgeführt wird. Warum? 22 jul. 122012-07-22 17:49:20

  0

Und deshalb: "Implementierungen dieser Methode (onPause) müssen sehr schnell sein, da die nächste Aktivität nicht fortgesetzt wird, bis diese Methode zurückgibt" http://goo.gl/8S2Y 22 jul. 122012-07-22 17:52:47


56

Activity Ergebnis muss vorfinish() wird aufgerufen werden. Durch Klicken auf BACK ruft tatsächlich finish() auf Ihrem activity, so dass Sie das folgende Snippet verwenden:

@Override 
public void finish() { 
    Intent data = new Intent(); 
    setResult(RESULT_OK, data); 

    super.finish(); 
} 

Wenn Sie NavUtils.navigateUpFromSameTask(); in onOptionsItemSelected() aufrufen, wird finish() genannt, aber Sie werden die falsche result code bekommen. Also müssen Sie finish() nicht navigateUpFromSameTask in onOptionsItemSelected() anrufen. wrong requestCode in onActivityResult

  0

Das funktioniert im OP-Fall, aber nicht im Allgemeinen, oder? Es gibt mehr Methoden als finish(), die das Ende des App-Lebenszyklus auslösen (über onPause() und onDestroy())? Siehe auch meinen Kommentar zu der anderen Antwort. 16 mär. 112011-03-16 22:24:08

  0

Und selbst wenn es nicht gäbe, wüssten Sie nicht, wann es in einem API-Update eingeführt würde. Nicht so einfach wie beim Ändern von onPause() oder onDestroy(). Das sind die Methoden, die Sie * übersteuern * sollen. 16 mär. 112011-03-16 22:31:58

+5

@pjv - Ich verstehe nicht, was 'finish' mit' onPause' und 'onDestroy' zu tun hat? Diese sind absolut nicht miteinander verwandt, außer dass "Finish" den Beendigungsprozess startet, zu dem "onPause" und "onDestroy" gehören. 30 aug. 112011-08-30 19:45:13


3

Siehe onActivityResult(int, int, Intent) doc

Lösung ist die Result für Wert Activity.RESULT_CENCELED zu überprüfen. Wenn ja, bedeutet dies, dass entweder ZURÜCK gedrückt wurde oder die Aktivität abstürzte. Hoffe es funktioniert für euch, arbeitet für mich :).

  0

Dies ist die genaue Lösung .. Sie müssen Ergebnis Code .. Niemand kann das Ergebnis anders als Sie im Code festlegen. Wenn also das Ergebnis nicht OK ist, bedeutet dies, dass entweder die Rückseite oder die Taste Crashed gedrückt wird. 15 sep. 152015-09-15 14:16:26


0

Versuchen zwingende onBackPressed (von Android-Level 5 aufgestiegen) oder außer Kraft setzen onKeyDown() und fangen KeyEvent.BUTTON_BACK (siehe Android Activity Results) Dies funktioniert der Trick für mich.


128

Sie benötigen die onBackPressed() -Methode und stellen das Ergebnis vor dem Aufruf von Super außer Kraft zu setzen, das heißt

@Override 
public void onBackPressed() { 
    Bundle bundle = new Bundle(); 
    bundle.putString(FIELD_A, mA.getText().toString()); 

    Intent mIntent = new Intent(); 
    mIntent.putExtras(bundle); 
    setResult(RESULT_OK, mIntent); 
    super.onBackPressed(); 
} 
+16

Beachten Sie, dass der Aufruf von super.onBackPressed() nach dem Aufruf von setResult() wie oben gezeigt erfolgen muss oder dass Sie das Original haben Problem noch einmal! 24 mai. 122012-05-24 18:28:43

+1

Das ist die beste Antwort hier. Wenn wir onPause() oder onDestroy() überschreiben, wird onBackPressed() zuerst aufgerufen und das Ergebnis auf 0 gesetzt. Bitte beachten Sie das! 05 jul. 132013-07-05 05:02:13

  0

oder Sie können das Standardergebnis in onCreate festlegen. Jeder Platz vor dem Ende() ist in Ordnung. 26 sep. 132013-09-26 15:35:03

+4

Ich habe einen ähnlichen Ansatz implementiert, aber es funktioniert immer noch nicht. Zum Beispiel habe ich den Anforderungscode und die Absicht, aber der resultCode ist immer 0. 30 apr. 152015-04-30 14:35:19


0

nicht auf jeder Logik in onPause einer Aktivität ausgeführt Verlassen Sie sich, wenn Sie in den Ausgang zurückkehren ein. Nach der Dokumentation:

Implementationen dieser Methode (onPause) muss sehr schnell sein, weil die nächste Aktivität nicht wieder aufgenommen werden, bis diese Methode

http://goo.gl/8S2Y für Details zurück.

Der sicherste Weg ist Ergebnis einstellen, nachdem jedes Ergebnis Änderungsvorgang abgeschlossen ist (wie Sie in Ihrer Antwort erwähnen)


2

sollten Sie außer Kraft setzen onOptionsItemSelected wie folgt aus:

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     final Intent mIntent = new Intent(); 
     mIntent.putExtra("param", "value"); 
     setResult(RESULT_OK, mIntent); 
     finish(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

0

Paste ich die Antwort kann nützlich sein für andere Leute: wenn ein launchMode mit Android: launchMode = "singleTask" Ich kann auch nicht das Ergebnis erhalten, der Doc sagt:

 /* <p>Note that this method should only be used with Intent protocols 
* that are defined to return a result. In other protocols (such as 
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may 
* not get the result when you expect. For example, if the activity you 
* are launching uses the singleTask launch mode, it will not run in your 
* task and thus you will immediately receive a cancel result. 
*/ 

und:

 /* <p>As a special case, if you call startActivityForResult() with a requestCode 
* >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your 
* activity, then your window will not be displayed until a result is 
* returned back from the started activity. This is to avoid visible 
* flickering when redirecting to another activity. 
*/ 

13

Wenn Sie einige benutzerdefinierte RESULT_CODE in onBackPressed Ereignis festlegen möchten, dann müssen Sie zuerst die result gesetzt und dann die super.onBackPressed() anrufen und Sie erhalten die gleiche RESULT_CODE in der Anrufer Tätigkeit des Empfangs onActivityResult Methode

@Override 
    public void onBackPressed() 
    { 
     setResult(SOME_INTEGER); 
     super.onBackPressed(); 
    }