2010-07-28 18 views
88

que iniciar el Activity (descendiente de PreferenceActivity) de mi actividad de los trabajadores de la siguiente manera:onActivityResult() llamada prematuramente

@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); 
} 

MyConfigure clase no tiene ningún setResult() llamadas. De hecho, la clase MyConfigure no tiene ningún código excepto OnCreate() donde carga preferencias usando addPreferencesFromResource.

Ahora se llama onActivityResult con requestCode de 1458 antes de tiempo, justo después de ejecutar MyConfigure actividad. Probado en 1.6 y 2.1 emuladores, así como 2.1 dispositivo. ¿Hay un llamado al setResult() enterrado en algún lugar en PreferenceActivity? ¿O cómo se puede explicar esta llamada prematura?

+1

Una actividad no termina en setResults(), que termina en el final(). ¿Puedes mostrar el método onCreate de tu actividad MyConfigure? –

+0

Correcto, no es así. Sin embargo, algo llama a setResult() antes de tiempo y me pregunto qué es. El código de onCreate es trivial: MyConfigure clase pública se extiende PreferenceActivity { \t @ Override \t protected void onCreate (Bundle savedInstanceState) { súper.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); } } –

+0

¿cómo crees saber que se llama setResult? – RoflcoptrException

Respuesta

246

Esto se corrige cambiando el modo de puesta en marcha a singleTop: (?)

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

Hay un insecto/función en Android, que informa de inmediato resultado (que no se ha fijado todavía) para Activity, declarados como singleTask (a pesar de que la actividad continúa ejecutándose). Si cambiamos launchMode de la actividad principal de singleTask a singleTop, todo funciona como se esperaba: el resultado se informa solo después de que la actividad finaliza. Si bien este comportamiento tiene cierta explicación (solo puede existir una actividad de singleTask y puede haber varios camareros para ella), esta sigue siendo una restricción no lógica para mí.

+0

Ohh, sí, gracias, ¡respuesta increíble! –

+2

¡Parece un error! ^^ comportamiento muy raro! –

+7

Si la actividad tiene modo de inicio singleTask, no necesita recibir resultados de sub-actividades usando onActivityResult. Las subactividades simplemente llaman a finish() y luego inician la actividad principal con intención de datos. En la actividad principal, debe anular el método NewInntent y procesar el intento recibido. – Nik

-1

De nuevo, como en el comentario de Mayra, setResult() no tiene nada que ver con su problema. por alguna razón, la clase MyConfigure finaliza y cuando ocurre PreferenceActivity simplemente se supone que puede haber un resultado de MyConfigure porque así es como escribió el código.

Esto también sucede cuando se fuerza hacia atrás cualquier actividad comenzó con eso startActivityForResult() ...

Por lo tanto, creo que es mejor centrarse en por qué su clase MyConfigure se terminó por la fuerza.

+0

La clase MyConfigure NO termina, sus suposiciones son incorrectas, lo siento. Si lo hiciera, no habría duda de que –

5

me acaba de quitar toda mi costumbre "android: launchMode" de mi actividad y todo funcionaba como un encanto. No es una buena idea cambiar esto cuando no se sabe EXACTAMENTE qué es lo que Android está entendiendo ... Android es un poco complicado de esta manera.

+0

esto funcionó tan bien para mí. ¡Gracias! – thiagolsilva

15

He resuelto mi problema después de eliminar intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); antes de llamar al fragment.startActivityForResult(intent, 0);.

+0

¡Gracias! Esto resolvió mi problema. ¿Hay alguna explicación para esto en alguna parte? –

+0

¡Gracias! Esto resolvió mi problema. –

1

Esto me sucedió cuando la intención tenía el conjunto Intent.FLAG_RECEIVER_FOREGROUND bandera.

(Sí, esa bandera no está relacionada con la actividad, pero tuve que en todos mis intentos, como parte de una solución de escopeta en a different problem.)

Cuestiones relacionadas