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?


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í.


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);.


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.


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 ).


-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.