2012-04-05 15 views
5

Ho 2 attività AAA e BBB. Chiaro BBB da AAA utilizzando startActivityForResult (Intent, int). Dopo aver finito con BBB, premo il pulsante Indietro per tornare a AAA. In BBB, sovrascrivo onPause() e imposta il risultato utilizzando setResult (RESULT_OK).risultato non impostato su onPause() utilizzando setResult() quando si preme il pulsante Indietro

In AAA, controllo il mio risultato in onActivityResult (int requestCode, int resultCode, Intent data) e continuo a ricevere RESULT_CANCELLED.

Dopo aver trascorso qualche tempo su google/StackOverflow, ho capito che se sovrascrivo onBackPressed() e impostare il risultato in esso, allora funziona assolutamente bene.

Quello che non riesco a capire è che, perché il risultato non viene impostato su onPause(), quando in realtà onPause() viene chiamato dopo onBackPressed(). Ho passato i flussi di attività nei documenti di sviluppo e sono abbastanza chiaro su ciò che è stato menzionato.

Qualcuno ha qualche idea su questo comportamento o potrebbe spiegarlo meglio?

+1

Duplicato di http://stackoverflow.com/questions/2679250/setresult-does-not-work-when-back-button-pressed – pjv

risposta

0

Penso che il problema qui potrebbe essere che onPaused potrebbe essere chiamato dopo aver già restituito l'attività precedente. Ho visto un comportamento simile in altri test. Prova ad aggiungere alcune stampe Log.d per confermare l'ordine della chiamata onPause rispetto alla chiamata onActivityResult.

+0

Ho verificato che, anche il flusso delle attività è organizzato, in modo che non sia il caso http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu

4

Si dovrebbe dare un'occhiata al riferimento onActivityResult. http://developer.android.com/reference/android/app/Activity.html#onActivityResult%28int,%20int,%20android.content.Intent%29

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation. 

You will receive this call immediately before onResume() when your activity is re-starting. 

chiamata setResult in finish(). È possibile chiamare la Besause onPause() quando inizia una nuova attività da BBB.

+0

Ho avuto la possibilità di impostare il risultato sia in overriding finish() che onBackPressed(). Per quanto riguarda le 3 opzioni in cui potrebbe essere RESULT_CANCELLED, non è sicuramente l'opzione crash. Potrebbe essere la seconda opzione. Non so come controllarlo. Non sono sicuro se qualche altra funzione imposta il codice risultato dopo che l'ho impostato esplicitamente in onPause(). Ho anche provato a chiamare finish() in onPause(). – Shubhayu

+0

Perché stai chiamando finish() in onPause(). onPause() chiamato quando va in background. Se premi il tasto home da BBB, verrà chiamato onPause(). E quando onBackpressed() chiamato finish() ha anche chiamato.Ecco perché setResult() in onBackpressed() funziona. Perché non metti il ​​risultato in questi due metodi? – Shaiful

+0

Stavo provando varie cose cercando di capire il flusso e cosa stava causando il comportamento. Sono d'accordo che onPause() verrà chiamato quando si fa clic sul pulsante Home, ma non risponde alla mia domanda che il risultato che imposto esplicitamente in onPause() non viene propagato ad AAA quando faccio clic sul pulsante Indietro. – Shubhayu

0

Molto probabilmente il caso deve essere il metodo del ciclo di vita.

Quando si preme il tasto indietro in BBB acctty in primo luogo onPause() viene chiamato in modo da impostare qualcosa in onPause(), quindi questo metodo è seguito da onStop() e ulteriormente seguito da OnDestroy() perché l'attività è stata completata. Quindi, se si imposta qualcosa in onPause() è in fase di impostazione, ma poiché è seguito da onDestroy(), il sistema operativo potrebbe forzatamente annullare l'attività al termine dell'attività.

Inoltre, se si imposta qualcosa in onPause(), se l'applicazione perde lo stato attivo o viene ridotta a icona, anche onPause() viene chiamato potrebbe essere la stabilità dell'app che si potrebbe perdere. Quindi suggerito di non usare onPause(), meglio andare con onKeyUp() o suBackPressed().

+0

In realtà non dovrebbe essere un problema perché secondo Dev Docs, il flusso è impostato http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu

Problemi correlati