studio intent activity android android-intent android-activity startactivityforresult

android - intent - Usando startActivityForResult, ¿cómo obtener requestCode en la actividad secundaria?



startactivityforresult fragment (3)

Tengo cuatro actividades, digamos A, B, C y D. Mi situación es A iniciará la actividad B por startActivityForResult.

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

En otra situación, voy a B con otra situación. me gusta

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

En B, necesito llamar a C o D dependiendo de requestCode. Es decir, si UNO necesita comenzar con C else D.
Entonces, 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.


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

Iniciar una actividad en realidad es solo 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 recibe 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. Entonces, el botón "Comprar" usa 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.

Entonces, si pasa el código de solicitud como parámetro, terminará con un código que necesita hacer lo mismo para un par de códigos de solicitud diferentes, 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.


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

intent.putExtra("requestCode", requestCode);

O si ha utilizado startActivityForResult muchas veces, entonces mejor que editar cada una, puede override el startActivityForResult en su Activity , agregar su código allí como este

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

Por lo tanto, no es necesario editar todos sus startActivityForResult
Espero que te haya ayudado


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 dirías como:

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

Y en la Actividad B , obtienes la acción fácilmente:

getIntent().getAction();