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

85

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

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

En otra situación lo haré B con otra situación. me gusta

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

En B, necesito llamar a C o D según requestCode. Es decir, si UNO necesita iniciar C, de lo contrario D.
Entonces necesito saber cómo verificar el código de solicitud en la Actividad secundaria (B aquí).
En otras palabras, quiero obtener el código de solicitud con el que se inició la Actividad B.

Jithin
fuente

Respuestas:

137

Puede pasar el código de solicitud poniendo extra.

intent.putExtra("requestCode", requestCode);   

O si ha utilizado startActivityForResultmuchas veces, entonces mejor que la edición de cada, puede overrideel startActivityForResulten su Activity, que no agregar código como éste

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

Por lo tanto, no es necesario editar todo su startActivityForResult.
Espero que le haya ayudado.

Labeeb Panampullan
fuente
49
¿Realmente no hay forma de que una actividad secundaria obtenga su código de solicitud?
i_am_jorf
1
Hasta ahora, según mi leal saber y entender, no creo que de otra manera.
Labeeb Panampullan
17
Me preguntaba lo mismo: esta es una de esas cosas en las API de Android que no tiene ningún sentido lógico.
Artem Russakovskii
7
startActivityForResult se puede utilizar para iniciar actividades en otras aplicaciones, requestCode es asunto privado de su aplicación. En este sentido, tiene sentido que Intent no tenga tal método y el enfoque correcto es establecer una acción que indique exactamente lo que desea que haga la actividad.
Maciej Beimcik
27

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 es realmente otra forma de llamar a un método. Cuando llamas a un método, recibes el resultado de forma sincrónica (justo allí donde hiciste la llamada). En este caso, solo está pasando la información que el método necesita para hacer su trabajo. No le está diciendo de dónde lo llamó.

Iniciar una actividad es el análogo asincrónico de llamar a un método, en cuyo caso recibe el resultado en el método especial onActivityResult (). En este método, necesita 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 "Comprar" e "Iniciar sesión" (ya que actualmente no ha iniciado sesión). Al presionar "Iniciar sesión" se iniciará una actividad llamada "Iniciar sesión" que intentará iniciar sesión como usuario utilizando la información proporcionada. Al presionar "Comprar" primero se iniciará la misma actividad de "Iniciar sesión" y, si el inicio de sesión fue exitoso, comenzará 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 el que se haya llamado, 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 manera, terminará con un código más modular, más fácil de mantener y más fácil de extender.

Szabolcs Berecz
fuente
1
¿Qué pasa si se trata de un "administrador" de tipo y desea que entre un código de solicitud para "guardar" un cierto valor (valor guardado en extras). Otro código de solicitud que "recuperaría" un valor (y devolvería en extras) pero dentro de esta actividad también pueden administrar en general los valores guardados como cambiar el nombre, editar, eliminar, etc. ¿Qué piensas sobre algo así? Creo que evitaría la duplicación de código / actividades para realizar las mismas acciones.
JRomero
@ J.Romero No hagas eso, solo complicará las cosas. Simplemente coloque esa funcionalidad en una clase (utilidad / singleton). Es posible que también desee ver Handler and Service
Szabolcs Berecz
3
Szabolcs La actividad del niño, incluso si "no necesita conocer este valor", puede necesitar pasar el valor a la siguiente actividad en una cadena. Irónicamente, necesitamos escribir código más redundante para esto. Para algo que no necesitamos saber tanto como recibimos más conferencias para leer sobre lo que no deberíamos hacer.
user250343
No veo cómo esto ilustra por qué a una actividad infantil se le debe negar el acceso al código de solicitud. Ni siquiera estoy seguro de por qué sería necesario acceder al código de solicitud en su ejemplo particular, considerando que las llamadas de compra ahora e inicio de sesión son para dos actividades separadas de todos modos.
Drazen Bjelovuk
1
@EvanR. quizás una mejor arquitectura sería subclasificar la actividad del elemento "maestro" en actividades separadas de agregar / editar. Por lo tanto, hay una reutilización mínima de código, pero cada actividad se puede invocar de forma independiente.
Dane Powell
11

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

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

Y en Actividad Bobtienes la acción fácilmente:

getIntent().getAction();
Marcel Bro
fuente
0

Puede usar getCallingActivity () para obtener la actividad que inició la actividad actual y que recibirá el valor de resultado con el código de respuesta al final.

Moaz Rashad
fuente