onActivityResult () llamado prematuramente

92

Comienzo el Activity(descendiente de PreferenceActivity) de mi actividad de trabajador de la siguiente manera:

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

MyConfigurela clase NO tiene ninguna setResult()llamada. De hecho, la MyConfigureclase no tiene ningún código excepto OnCreate()donde carga las preferencias usando addPreferencesFromResource.

Ahora onActivityResultse llama con el requestCodede 1458antes de tiempo, justo después de MyConfigureque se ejecuta la actividad. Probado en emuladores 1.6 y 2.1, así como en dispositivos 2.1. ¿Hay una llamada a setResult()enterrar en algún lugar PreferenceActivity? ¿O de qué otra manera se puede explicar esta llamada prematura?

Devolución de llamada de Eugene Mayevski
fuente
1
Una actividad no termina en setResults (), termina en finish (). ¿Puede mostrar el método onCreate de su actividad MyConfigure?
Cheryl Simon
Bien, no es así. Sin embargo, algo llama a setResult () antes de tiempo y me pregunto qué es. El código de onCreate es trivial: la clase pública MyConfigure extiende PreferenceActivity {@Override protected void onCreate (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Devolución de llamada de Eugene Mayevski
¿Cómo crees saber que se llama setResult?
RoflcoptrException
Eso es exactamente para lo que creé la pregunta. Para averiguar por qué se llama a onActivityResult de forma prematura.
Devolución de llamada de Eugene Mayevski
¿Qué dice la salida de logcat en este período? Específicamente la etiqueta "ActivityManager", que muestra qué Intents se están llamando.
Christopher Orr

Respuestas:

254

Esto se soluciona cambiando el modo de lanzamiento a singleTop:

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

Hay un error / característica (?) En Android, que informa inmediatamente el resultado (que aún no se ha configurado) para Activity, declarado como singleTask(a pesar de que la actividad continúa ejecutándose). Si cambiamos launchModela actividad principal de singleTaska singleTop, todo funciona como se esperaba; el resultado se informa solo después de que finaliza la actividad. Si bien este comportamiento tiene cierta explicación (solo singleTaskpuede existir una actividad y pueden ocurrir varios esperadores), esta todavía no es una restricción lógica para mí.

Devolución de llamada de Eugene Mayevski
fuente
2
¡Parece un error! ^^ comportamiento muy extraño!
Felipe
7
Si la actividad tiene el modo de inicio de singleTask, no es necesario recibir resultados de subactividades usando onActivityResult. Las subactividades simplemente llaman a finish () y luego comienzan la actividad principal con la intención de datos. En la actividad principal, debe anular el método onNewIntent y procesar la intención recibida.
Nik
43
launchMode = "singleInstance" también causa este comportamiento
ffleandro
1
Parece que esto no funcionó para mí, intenté singleTop en la actividad de los padres, pero fue en vano. También configuré el indicador de intención en FLAG_ACTIVITY_SINGLE_TOP, aunque la solicitud ahora muestra el valor correcto, pero el resultado es siempre 0.
Neon Warge
11
sucede en Kitkat 4.4.4, no sucede en Lolipop.
Somasundaram Mahesh
18

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

TPG
fuente
1
¡Gracias! Esto resolvió mi problema. ¿Hay alguna explicación para esto en alguna parte?
Conner Harkness
Hay una explicación para esto en los documentos para la bandera de estos días "Esta bandera no se puede usar cuando la persona que llama solicita un resultado de la actividad que se está lanzando". Bueno, no es una explicación, ¡pero al menos una advertencia!
Code Noviciate
4

Acabo de eliminar todos mis "android: launchMode" personalizados de mi actividad y todo funcionó a la perfección. No es una buena idea cambiar esto cuando no sabes EXACTAMENTE lo que está entendiendo Android ... Android es un poco complicado de esta manera.

Felipe
fuente
1

Esto me sucedió cuando la intención tenía la Intent.FLAG_RECEIVER_FOREGROUNDbandera puesta.

(Sí, esa bandera no está relacionada con la actividad, pero la tenía en todas mis intenciones como parte de una solución rápida para un problema diferente ).

Sam
fuente
-1

Nuevamente como en el comentario de Mayra, setResult()no tiene nada que ver con tu problema. por alguna razón, la MyConfigureclase termina sola y cuando sucede PreferenceActivitysimplemente asume que podría haber un resultado de MyConfigureporque así es como escribiste el código.

esto también sucede cuando fuerza hacia atrás cualquier actividad con la que comenzó startActivityForResult()...

Entonces, creo que es mejor concentrarse en por qué su MyConfigureclase se termina a la fuerza.

optimismo
fuente
La clase MyConfigure NO termina, sus suposiciones son incorrectas, lo siento. Si lo hiciera, no habría duda
la devolución de llamada de Eugene Mayevski el