onrestart - onresume android
Android-startActivityForResult activa inmediatamente onActivityResult (11)
Además, asegúrese de que la intención no tenga el conjunto Intent.FLAG_ACTIVITY_NEW_TASK
.
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?
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
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);
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.
Mi problema fue con la actividad de llamada. Su declaración en el AndroidManifest tenía la siguiente propiedad:
android:noHistory="true"
Cambió a "falso" y ahora funciona bien.
No puede usar startActivityForResult()
si su actividad se inicia como singleInstance
o singleTask
. standard
modo de lanzamiento standard
o singleTop
solucionará el problema.
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.
llame a
getParent().startActivityForResult()
desde sugetParent().startActivityForResult()
su padre (
ActivityGroup
) podrá manejaronActivityResult
. Así que creé una subclase deActivityGroup
yonActivityResult
esto enonActivityResult
.Puede volver a enrutar ese resultado a la subactividad si lo necesita. Simplemente obtenga la actividad actual mediante
getLocalActivityManager().getCurrentActivity()
. MishandleActivityResult(requestCode, resultCode, data)
heredan de una actividad personalizada, así que agregué unhandleActivityResult(requestCode, resultCode, data)
en esa subclase para que elActivityGroup
llame.
ejemplo: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html
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.
También se activa si tienes 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);
onActivityResult()
también pasará RESULT_CANCELED
como resultCode
si escribe mal el nombre del paquete o de la clase en el archivo de manifiesto.
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).