2012-08-12 22 views
5

Buscando alta y baja no ha dado ningún resultado para mi problema. Por lo tanto, finalmente estoy publicando para pedir ayuda.¿Cómo hacer que startActivityForResult funcione en la actividad externa?

Tengo dos aplicaciones, ambas escritas por mí. La aplicación A inicia la aplicación B, pasando parámetros a través de Intent.putExtra(). Esto funciona perfectamente bien cuando se inicia la aplicación B, los parámetros se pasan muy bien.

Sin embargo, no puedo encontrar una manera de devolver una respuesta a la Aplicación A. El uso de startActivityForResult() siempre me dio onActivityResult() inmediato con RESULT_CANCELED. Tras una inspección adicional, el logcat me dio una advertencia que decía "La actividad se está iniciando como una nueva tarea, por lo que se cancela el resultado de la actividad".

Intenté hacer la actividad de la aplicación B con diferentes modos de lanzamiento, filtros de acción (android.intent.action.PICK), pero nada de lo que hice cambió nada.

¿Estoy tratando de hacer lo imposible? Por lo que entiendo, lo que estoy intentando hacer debería ser similar al uso de actividades de terceros para seleccionar imágenes de la galería de fotos del dispositivo.

EDIT:

Ok, he intentado eliminar la categoría lanzador, desde la actividad B, pero todavía no funciona. Aquí está mi actividad:

<activity android:name=".${CLASSNAME}" android:label="@string/app_name" android:configChanges="mcc|mnc|locale|keyboardHidden|orientation" android:launchMode="standard"> 
    <intent-filter> 
     <action android:name="android.intent.action.PICK" /> 
    </intent-filter> 
</activity> 

¿Alguien realmente ha conseguido que esto funcione? Estoy empezando a sospechar que comenzar una actividad que es de otra aplicación nunca puede devolver los resultados ya que parece que siempre comenzará una nueva tarea sin importar lo que pongas en el "filtro de intención".

+0

publique el código que está utilizando compilar e inicie la intención para ActivityB. deberías poder poner algo como esto: 'this.setResult (Activity.RESULT_OK, data);' en la segunda Actividad para volver al primero. – FoamyGuy

+0

¿Puedes publicar tu archivo de manifiesto? Tal vez la Actividad B tiene alguna etiqueta especial nandeesh

+0

Hmmm ... La Actividad B tenía la ¿Esto causa un problema? No estoy en mi máquina de trabajo en este momento. Trataré de eliminar eso y ver si eso funciona. Lo que he leído es que comenzar una actividad que no forma parte del mismo paquete siempre comenzará en una nueva tarea. Si ese es el caso, startActivityForResult no funcionaría para iniciar una actividad externa en otra apk? –

Respuesta

0

En su actividad B, que debería tener algo como esto,

Intent intent = new Intent(); 
setResult(Activity.RESULT_OK, intent); 
finish(); 

o puede ser,

setResult(Activity.RESULT_OK); 
finish(); 

en el que no necesita pasar los datos a la actividad A.

De lo contrario, siempre terminará con el código de resultado Activity.RESULT_CANCELED;

Si una actividad infantil falla por cualquier motivo (por ejemplo, chocando), la actividad padre recibirá un resultado con el código RESULT_CANCELED.

Espero que esto ayude.

+1

Implementé eso. El problema es que la actividad A llamó a ActivityResult() incluso antes de que finalizara la actividad B. Logcat me dice "La actividad se lanza como una tarea nueva, por lo que se cancela el resultado de la actividad". Parece que la actividad B se lanzó como una nueva tarea, lo que no debería sorprender, ya que es una aplicación apk diferente. ¿Cómo se escriben las actividades de utilidad como selector de imágenes? –

+0

@ Lf3T-Hn4D, como mencionaste, tienes la categoría 'launcher' y comenzará la actividad como una tarea nueva. Por lo tanto, se lanzará completamente independiente de la actividad que lo lanzó. Elimina ese estilo de categoría y prueba. http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK –

+0

Ah ... vale. Lo probaré e informaré cuando regrese a mi máquina de trabajo. :-) Gracias –

9

Asegúrate de que la actividad que estás iniciando no tiene android: launchMode configurado en el manifiesto y comprueba el android: taskAffinity no se está utilizando. Ver aquí:

http://developer.android.com/guide/topics/manifest/activity-element.html#aff

Asegúrese de que la intención que está utilizando para poner en marcha la actividad no tiene FLAG_ACTIVITY_NEW_TASK fija en él. Ver aquí:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

En particular nota: "Esta bandera no se puede utilizar cuando la persona que llama está solicitando un resultado de ser lanzada la actividad."

Si la actividad se inicia como parte de una nueva tarea, Android llamará inmediatamente a onActivityResult() con RESULT_CANCELED porque una actividad en una tarea no puede devolver los resultados a otra tarea, solo las actividades en la misma tarea pueden hacerlo.

+0

gran ayuda, gracias – Ninja

1

que tiene el mismo problema que tomó un vistazo a código fuente, y por qué se añadiría la bandera NEW_TASK.

Resulta que si bien la actividad de la fuente a o destino la actividad B están utilizando un solo lanzamiento instancia modo, el indicador NEW_TASK se agrega automáticamente:

if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 
     // The original activity who is starting us is running as a single 
     // instance... this new activity it is starting must go on its 
     // own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 
      || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 
     // The activity being started is a single instance... it always 
     // gets launched into its own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } 

Como posee ambas aplicaciones, debe poder garantizar que esos modos de lanzamiento no estén definidos en forma manifiesta o intencionada.

Hasta ahora no he podido encontrar ninguna otra instancia de la bandera NEW_TASK siendo configurada de mala gana.

Cuestiones relacionadas