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?

TomBomb
fuente

Respuestas:

315

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

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

James Zhang
fuente
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!

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

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

noelicus
fuente
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);
Roger Alien
fuente
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.

usuario3829751
fuente
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

Andrea Falappi - Polipo
fuente
1

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

Sanju
fuente
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

fantaxy025025
fuente
¿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.

musterjunk
fuente
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);

Krish
fuente
0

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

Yu-Long Chen
fuente