67

Tengo cuatro actividades, digamos A, B, C y D. Mi situación es A iniciará la actividad B por startActivityForResult.Usando startActivityForResult, ¿cómo obtener requestCode en la actividad secundaria?

startActivityForResult(new Intent(this,B.class),ONE); 

En otra situación voy a B con otra situación. como

startActivityForResult(new Intent(this,B.class),TWO); 

En B, necesito llamar a C o D dependiendo de requestCode. Es decir, si UNO necesita iniciar C else D.
Así que necesito saber cómo verificar el código de solicitud en la Actividad hija (B aquí).
En otras palabras, quiero obtener el código de solicitud con el que se inició la Actividad B.

Respuesta

109

Puede pasar el código de solicitud poniendo más.

intent.putExtra("requestCode", requestCode); 

O si usted ha usado startActivityForResult muchas veces, entonces mejor que la edición de cada uno, se puede override la startActivityForResult en su Activity, añadir que el código no como esto

@Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     intent.putExtra("requestCode", requestCode); 
     super.startActivityForResult(intent, requestCode); 
    } 

Así que no hay necesidad de edite todos sus startActivityForResult
Espero que lo haya ayudado

+33

¿Realmente no hay manera para que una actividad niño obtener su solicitud ¿código? –

+1

Hasta ahora, según mi mejor conocimiento, no pienso de otra manera. –

+11

Me preguntaba lo mismo: esta es una de esas cosas en las API de Android que no tiene ningún sentido lógico. –

22

El código de solicitud no se pasa automáticamente a la actividad iniciada porque d no es necesario (y no debería) saber este valor. Solo necesita saber qué hacer y no desde dónde se inició.

Iniciar una actividad es en realidad otra forma de llamar a un método. Cuando llamas a un método, recibes el resultado de forma síncrona (justo donde hiciste la llamada). En este caso, solo está ingresando la información que el método necesita para hacer su trabajo. No estás diciendo de dónde lo llamaste.

El inicio de una actividad es el análogo asíncrono de invocar un método, en cuyo caso recibirá el resultado en el método especial onActivityResult(). En este método, debe saber qué hacer con el resultado que acaba de recibir y tiene el código de solicitud para esto.

Para aclarar un poco por qué no es una buena idea pasar el código de solicitud como parámetro, considere la actividad de ejemplo que muestra un producto que puede comprar. En esta actividad, hay dos botones etiquetados como "Comprar" e "Iniciar sesión" (ya que actualmente no está conectado). Al presionar "Iniciar sesión" se iniciará una actividad llamada "Iniciar sesión" que intentará iniciar sesión en el usuario utilizando la información proporcionada. Al presionar "Comprar" se iniciará la misma actividad de "Inicio de sesión" y si el inicio de sesión fue exitoso, comience la actividad de compra.

Ahora, el botón "Iniciar sesión" usa el código de solicitud 1 para iniciar la actividad de inicio de sesión, pero el botón "Comprar" no puede usar el mismo código de solicitud ya que tendrá que hacer algo diferente si el inicio de sesión es exitoso. Por lo tanto, el botón "Comprar" utiliza el código de solicitud 2.

En la actividad "Iniciar sesión", es posible que reciba dos códigos de solicitud diferentes según el lugar desde donde se realizó la llamada, pero deberá realizar el mismo procedimiento.

lo tanto, si se pasa en el código de petición como un parámetro, el resultado final será con el código que tiene que hacer lo mismo para un par de diferentes códigos de solicitud, como:

if (requestCode == LOGIN || requestCode == BUY) { 
    // ... 
} else ... 

También terminar almacenando las constantes del código de solicitud en una ubicación central, por ejemplo una clase llamada RequestCodes.

En resumen, el código de solicitud solo debe usarse para decidir qué hacer con el resultado recibido. De esta forma, terminará con un código más modular, más fácil de mantener y más fácil de extender.

+1

¿Qué pasa si se trata de un "administrador" de tipo y desea que ingrese un código de solicitud para "guardar" un cierto valor (valor guardado en extras). Otro código de solicitud que "recupera" un valor (y devuelve extras) pero dentro de esta actividad también pueden gestionar los valores guardados, como cambiar el nombre, editar, eliminar, etc. ¿Qué piensas sobre algo así? Creo que evitaría duplicar código/actividades para hacer las mismas acciones. – JRomero

+0

@ J.Romero No hagas eso, simplemente complicará las cosas. Simplemente ponga esa funcionalidad en una clase (utility/singleton). También es posible que desee consultar [Handler] (http://developer.android.com/reference/android/os/Handler.html) y [Service] (http://developer.android.com/reference/android/ app/Service.html) –

+2

Szabolcs La actividad secundaria incluso si "no necesita conocer este valor" puede necesitar pasar el valor a la siguiente actividad de una cadena. Irónicamente, necesitamos escribir más código redundante para esto. Para algo que no necesitamos saber tanto como obtener más conferencias para leer sobre lo que no deberíamos hacer. – user250343

4

Terminé usando una acción de intención personalizada para pasar este tipo de información a la Actividad de lanzamiento.

protected static final String ACTION_DO_C = "do_c"; 
protected static final String ACTION_DO_D = "do_d"; 

Entonces te gustaría ir como:

final Intent intent = new Intent(this,B.class) 
intent.setAction(ACTION_DO_C); 
startActivityForResult(intent,ONE); 

Y en la Actividad B se obtiene fácilmente la acción:

getIntent().getAction(); 
Cuestiones relacionadas