Android – startActivityForResult activa inmediatamente onActivityResult

Estoy lanzando actividades desde la actividad principal de mi aplicación utilizando la llamada startActivityForResult(intent, ACTIVITY_TYPE) , y todas funcionan a excepción de una.

Este, cuando se llama, inicia la actividad como se desea, pero en el registro puedo ver que onActivityResult() se desencadena inmediatamente. La actividad aparece pero RESULT_CANCELED se devuelve inmediatamente a onActivityResult() .

Luego interactúo con la actividad, onActivityResult() un botón que llama a 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?

No puede usar startActivityForResult() si su actividad se inicia como singleInstance o singleTask . standard modo de lanzamiento standard o singleTop solucionará el problema.

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

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

También me gustaría agregar que puedes 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);
Lo cual borrará esa bandera, y luego puede proceder a: startActivityForResult(in, action);

La razón por la que hago esto es porque 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.

startActivityForResult() no funciona con una actividad singleInstance o singleTask en la versión pre-lollipop de Android. Desde Android 5 funciona (ver esta respuesta para más detalles).

También se activa si tienes FLAG_ACTIVITY_NEW_TASK en tu bash.

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

Mi problema fue con la actividad de llamada. Su statement en el AndroidManifest tenía la siguiente propiedad:

 android:noHistory="true" 

Cambió a “falso” y ahora funciona bien.

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

  • todas las actividades tendrán el mismo atributo 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

Ver esto para la afinidad de tareas: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072

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

  1. llame a getParent().startActivityForResult() desde su getParent().startActivityForResult()

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

  3. Puede volver a enrutar ese resultado a la subactividad si lo necesita. Simplemente obtenga la actividad actual mediante getLocalActivityManager().getCurrentActivity() . Mis handleActivityResult(requestCode, resultCode, data) heredan de una actividad personalizada, así que agregué un handleActivityResult(requestCode, resultCode, data) en esa subclase para que el ActivityGroup llame.

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

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

En Android Manifest set android:launchMode="singleTop" para la actividad que desea abrir con el resultado y al abrir la actividad establece el indicador intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);