Android: startActivityForResult activa de inmediato onActivityResult


144

Estoy iniciando actividades desde la actividad principal en mi aplicación usando la llamada startActivityForResult(intent, ACTIVITY_TYPE), y todas están funcionando menos una.

Este, cuando se llama, inicia la actividad como se desea, pero en el registro puedo ver que onActivityResult()se está activando de inmediato. La actividad aparece pero RESULT_CANCELEDse vuelve 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?

Respuestas:


315

No puede usar startActivityForResult()si su actividad se inicia como singleInstanceo singleTask. standardo el singleTopmodo de inicio solucionará el problema.


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

9
¡GUAUU! ¡Esto parece algo obvio para agregar a los javadocs! Perdí toda una tarde tratando de hacer que esto funcionara, y esta respuesta SO me recordó que mi Actividad estaba configurada en singleTop.
swooby

20
singleTopme parece bien, singleTasksin embargo , estaba causando este problema y, por singleInstancelo tanto , definitivamente también lo haría
darnmason

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

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

110

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

De los documentos :

Este indicador no se puede usar cuando la persona que llama solicita un resultado de la actividad que se inicia.


3
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
kyay

@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

21

He visto este comportamiento antes, asegúrese de que su actividad de destino (esa actividad especial) no esté singleInstanceen el archivo AndroidManifest. Si la actividad es singleInstance, ¡volverá RESULT_CANCELEDantes de iniciarse!


18

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_TASKagregado por defecto, así que llame:
in.setFlags(0);
lo 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 las actualizaciones múltiples.


Sé que esto es viejo, pero esto fue tan absolutamente invaluable para mí que quería agradecerle al usuario, y señalar a cualquiera que salta entre actividades que ¡esto está volviendo loco de oro! Me salvó el culo durante un hackathon;)
Wes Winn

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

¡Voto por esta respuesta ya que este era el problema exacto que estaba teniendo esta mañana! Gracias por la solucion!
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

5

startActivityForResult()no funciona con una singleInstanceo singleTaskactividad en la versión pre-lollipop de Android. Desde Android 5 funciona (vea esta respuesta para más detalles).


5

También se dispara si tienes FLAG_ACTIVITY_NEW_TASKen tu intento.

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

Gracias. Agregué FLAG_ACTIVITY_NEW_TASK en mi actividad.
Chirag Savsani

1

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.


1

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

  • todas las actividades tendrán la misma tarea de atributo de afinidad. ( 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


1

Además, verifique si android: noHistory = "true" en la actividad en Manifiesto, en caso afirmativo, no funcionará.


0

Para ActivityGroupo TabHosty otros, tal vez el xxxActivityes uno subActivityde sus padres. Entonces el startActivityForResultno puede funcionar pero el padre puede obtener el resultado.

  1. llamada getParent().startActivityForResult()desde su sub-actividad

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

  3. Puede redirigir ese resultado a la sub-actividad si es necesario. Simplemente obtenga la actividad actual por getLocalActivityManager().getCurrentActivity(). Mis sub-actividades heredan de una actividad personalizada, así que agregué una handleActivityResult(requestCode, resultCode, data)en esa subclase para ActivityGroupque llame.

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


¿Qué piensa sobre este caso especial cuando llama al navegador web predeterminado: codeproject.com/Questions/990063/…
Ahmad Ebrahimi

0

onActivityResult()también pasará RESULT_CANCELEDcomo resultCodesi escribe mal el paquete o el nombre de la clase en el archivo de manifiesto.


0

En el Manifiesto de Android configurado android:launchMode="singleTop"para la actividad que desea abrir con el resultado y al abrir el indicador de conjunto de actividadintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

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

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.