Android: startActivityForResult activa inmediatamente onActivityResult

Estoy lanzando actividades desde la actividad principal en mi aplicación usando la llamada startActivityForResult(intent, ACTIVITY_TYPE), y todos funcionan menos uno.

Este, cuando se llama, lanza la actividad como se desea, pero en el registro puedo ver que onActivityResult() se activa inmediatamente. La actividad aparece pero RESULT_CANCELED es devuelto inmediatamente a onActivityResult().

Luego interactúo con la actividad, presiono un botón que llama finish() y onActivityResult() no se llama esta vez (porque aparentemente ya se ha devuelto un resultado).

¿Esto tiene sentido para alguien? ¿Alguien ha visto este comportamiento antes?

preguntado Oct 26 '11, 22:10

13 Respuestas

No puedes usar startActivityForResult() si su actividad se lanza como un singleInstance or singleTask. standard or singleTop el modo de inicio solucionará el problema.

respondido 16 mar '17, 17:03

Gracias a los dos, tenía esto en mi archivo de manifiesto y lo había olvidado por completo. tombomba

¡GUAU! ¡Esto parece una cosa obvia para agregar a los javadocs! Perdí una noche entera tratando de que esto funcionara, y esta respuesta SO me recordó que mi Actividad estaba configurada en singleTop. - swooby

singleTop me parece bien singleTask Sin embargo, estaba causando este problema y, por lo tanto, singleInstance definitivamente también lo haría - maldito albañil

¡También pasé demasiado tiempo depurando esto! ¡¡Gracias!! - suomi35

En mi caso, no definí ninguna clase como singleInstance o singleTop, pero aún está sucediendo ... ¿alguna sugerencia? - Código

Además, asegúrese de que la intención no tenga la Intent.FLAG_ACTIVITY_NEW_TASK conjunto.

Desde el documentos:

Esta bandera no se puede utilizar cuando la persona que llama solicita un resultado de la actividad que se está iniciando.

Respondido el 14 de enero de 19 a las 11:01

Esto solucionó el problema en mi caso. El problema no fue causado por singleInstance, singleTop ni singleTask. - Diana

Eres una menta (un salvavidas). Este era mi problema exacto cuando quería que el usuario capturara una imagen en un Fragmento: kyay10

@Diana, ¿recuerdas lo que usaste en lugar de Intent.FLAG_ACTIVITY_NEW_TASK ? - Keselme

@Keselme Lo siento, ha pasado mucho tiempo, desearía poder ayudar, pero no lo recuerdo y ya no puedo acceder a ese código. - Diana

Sí, lo arreglé. startActivityForResult no debe usarse con Intent.FLAG_ACTIVITY_NEW_TASK - hanilozmen

He visto este comportamiento antes, asegúrese de que su actividad de destino (esa actividad especial) no sea singleInstance en el archivo AndroidManifest. Si la actividad es singleInstance, entonces volverá RESULT_CANCELED antes de lanzarlo!

Respondido el 15 de junio de 16 a las 20:06

También me gustaría agregar que podría llamar a una aplicación externa con:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Lo que crearía una intención con Intent.FLAG_ACTIVITY_NEW_TASK agregado por defecto, así que llame a:
in.setFlags(0);
Que borrará esa bandera, y luego puede proceder a: startActivityForResult(in, action);

La razón por la que hago esto es que tengo una aplicación de utilidad que tiene una funcionalidad común entre algunas otras aplicaciones y puedo mantener los cambios de código en una ubicación en lugar de preocuparme por múltiples actualizaciones.

Respondido el 19 de junio de 14 a las 18:06

Sé que esto es antiguo, pero fue tan absolutamente invaluable para mí que quería agradecer al usuario y señalarle a cualquiera que salte entre actividades que esto es malditamente oro. Salvó mi trasero durante un hackathon;) - wes winn

Esto es lo que necesita más atención. Es la mejor solución y me funciona perfectamente. Me ahorraste mucho tiempo, muchas gracias. - Aritra Roy

¡Voto a favor de esta respuesta ya que este era el problema exacto que estaba teniendo esta mañana! ¡Gracias por la solución! - Will Johnson

Gracias. intent.setFlags (0) resolvió el problema. Ahora la segunda aplicación comienza bien y devuelve el resultado a la aplicación de llamada: Niaz

startActivityForResult() no funciona con un singleInstance or singleTask actividad en la versión anterior a la piruleta de Android. Desde Android 5 funciona (ver esta respuesta para más detalles).

Respondido el 21 de Septiembre de 17 a las 20:09

También se activa si tiene FLAG_ACTIVITY_NEW_TASK en tu intento.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Respondido el 22 de Septiembre de 17 a las 20:09

Gracias. Agregué FLAG_ACTIVITY_NEW_TASK en mi actividad. - Chirag Savsani

Mi problema fue con la actividad de llamadas. Su declaración en el AndroidManifest tenía la siguiente propiedad:

android:noHistory="true"

Lo cambió a "falso" y ahora funciona bien.

Respondido 29 Abr '16, 23:04

Android 4.4 tiene un pequeño problema de esperar el regreso al final del cierre de la actividad.Para solucionar este comportamiento es importante configurar:

  • todas las actividades tendrán la mismo Atributo de afinidad de tarea. (TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Esta solución funciona con todas las versiones de Android.

Vea esto para taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072

Respondido el 07 de diciembre de 17 a las 12:12

Además, compruebe si android: noHistory = "true" en la actividad en Manifest, si es así, no funcionará.

respondido 26 nov., 18:06

Para ActivityGroup or TabHost y otros, tal vez el xxxActivity es un subActivity de su padre. Entonces el startActivityForResult no puede funcionar, pero el padre puede obtener el resultado.

  1. llamar al getParent().startActivityForResult() de tu subactividad

  2. tu padre (el ActivityGroup) podrá manejar el onActivityResult. Así que creé una subclase de ActivityGroup y manejé esto onActivityResult.

  3. Puede volver a enrutar ese resultado a la subactividad si es necesario. Solo obtén la actividad actual por getLocalActivityManager().getCurrentActivity() . Mis subactividades heredan de una actividad personalizada, así que agregué un handleActivityResult(requestCode, resultCode, data) en esa subclase para el ActivityGroup llamar.

ejemplo: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

Respondido el 23 de junio de 14 a las 14:06

¿Qué opinas sobre este caso especial al llamar al navegador web predeterminado? codeproject.com/Questions/990063/… - Ahmad Ebrahimi

onActivityResult() también pasará RESULT_CANCELED como el resultCode si escribe mal el paquete o el nombre de la clase en el archivo de manifiesto.

Respondido el 15 de junio de 16 a las 20:06

En conjunto de manifiesto de Android android:launchMode="singleTop" para la actividad que desea abrir con resultado y al abrir la actividad, establezca la bandera intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

respondido 26 nov., 16:12

Si tu definiste android:noHistory="true" en la actividad en su AndroidManifest.xml, causará el mismo problema aquí.

Respondido el 11 de Septiembre de 18 a las 11:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.