2011-06-14 14 views
5

Tengo una aplicación en la que estoy iniciando una nueva actividad y necesito obtener el resultado de la actividad antes de continuar.StartActivityForResult sincrónico - Esperando que se complete la actividad

Me doy cuenta de que startActivityForResult es asíncrono/no-bloqueante, y que puedo obtener el resultado de la actividad en la devolución de llamada onActivityResult.

Así que supongo que lo que estoy buscando es la mejor manera de esperar a que la actividad regrese ... ¿Algo como esto quizás? ¿O hay un mejor camino? Función

Actividad Launcher:

public String ActivityLauncher() 
{ 
    //Set up Intent 
    startActivityForResult(intent, 1); 
    while (mIsActivityDone == false) 
    { 
     Thread.Sleep(250); 
    } 
    //Continue with processing 
    String data = "<Data from Activity"> 
    return data; 
} 

de devolución de llamada:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    //Pull out the data 
    mIsActivityDone = true; 
} 

los datos tienen que ser devueltos a una función de llamada de alto nivel - esto es por lo que necesito esperar el resultado de la ActivityLauncher función.

Gracias!

Respuesta

7

Esto bloqueará el hilo de UI para que no se ejecute ninguna otra actividad. Utilizaría algún tipo de clase de devolución de llamada proporcionada por la función de nivel superior, en este tipo de situación y llamar a su función de devolución de llamada en onActivityResult

+1

De acuerdo, simplemente mueva "// Continuar con el procesamiento de datos" en el método 'onActivityResult()'. Si necesita hacerlo varias veces, también está bien: es por eso que startActivityForResult() toma un argumento 'int requestCode', que se vuelve a pasar a' onActivityResult() ', para que sepa qué solicitud está devolviendo. – Joe

+0

Gracias, aprecio la ayuda de arquitectura. –

2

Si puede iniciar estas actividades desde un nuevo hilo, Android tiene una solución para usted. Puedes usar Instrumentación. ¿Por qué necesitas un hilo nuevo? Porque startActivitySync verificará si está siendo invocado en un hilo principal. Si su hilo principal arrojará una excepción.

La instrumentación le permite controlar una actividad. Puedes monitorear esta actividad de forma bloqueada o no bloqueada.

IntentFilter intF = new IntentFilter("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH"); 

Instrumentation instrumentation = new Instrumentation(); 

Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(intF, null, true); 
Intent i = new Intent("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH"); 
instrumentation.startActivitySync(i); 
+0

Gracias por responder, ya terminé mi proyecto para Android, así que no puedo probarlo en este momento, ¡pero lo aprecio! –

+0

Buena sugerencia. Solo quiero agregar que esto solo funcionará si sus actividades residen dentro del mismo proceso (aplicación). La API no funciona en todos los procesos. – Bamerza

Cuestiones relacionadas